1.shell脚本的种类和注意事项
种类:cat /etc/shells
bin/bash=======>Linux 缺省使用
bin/sh
bin/csh
bin/ksh
注意事项:和C不同成功返回0失败返回1
好的语法习惯:当去取变量的数值的时候一般加上"VAR"
2.执行脚本方法
1.chmod a+x shell.sh ./shell.sh
2./bin/bash shell.sh
3. . shell.sh
3.指令和语法
A.变量
VAR=hello --本地变量(局部变量) echo $VAR env | grep &VAR 没有效果
export VAR设置成环境变量(全局变量) echo $VAR || env | grep &VAR 有效果
alias ===将指令重命名
B.命令代换
反引号======ESC 下面的按键------>替换功能
VAR=date
----------------------->echo $VAR ---->调用date的功能
( ) 等 价 : V A R = ()等价:VAR= ()等价:VAR=(date)
C.算术代换
VAR=33,echo $((VAR+3)) == echo ( ( (( ((VAR+3)) == echo $[ VAR+3]
echo $[ 2#10 +11]//2进制的10+(十进制)11
D.转义字符:\
touch $\ \test.sh ---- > 生成 $ test.sh 删除也是
touch ./-abc -abc
等价touch – -abc
touch ./-------xyz -------xyz
F.单引号双引号
VAR=
date
echo ' V A R ′ e c h o " VAR' echo " VAR′echo"VAR"
G.条件测试和比较符号
VAR=2
test $VAR -gt 1
比较符号
-gt 大于与否
-lt 小于
-qt大于
-eq等于
-ne不等于
-d是否是目录
-f是否是普通目录
-p特殊文件
-z判断字符串是0
-n不是0
H.与或非
-a为与 &&
-o 为 ||
-x为^
VAR=abc
F.分支语句
if [ -d t.txt ]; then
内容
fi特殊
if :;then echo “always true” ; fi
***注意: 表示一直为真
测试代码
#! /bin/bash
echo "Is it morning? please answer yes or no"
#相当于fgets()
read YES_OR_NO
if [ "$YES_OR_NO" = "yes" ]; then
echo "Good morning !"
elif [ "$YES_OR_NO" = "no" ]; then
echo "Bad weather!!"
else
echo "Sorry, $YES_OR_NO not recognize. Enter yes or no"
fi
case “$VAR” in
y] ;;
N] ;;
] ;;
;;---->代表break
read -p "please enther the first number n1 " n1
#! /bin/bash
echo "Is it morning? please answer yes or no"
#相当于fgets()
read YES_OR_NO
#取放到集合里面IN
case "$YES_OR_NO" in
#注意只有)2
yes|y|YES|Yes)
echo "Good morning !";;
no|No)
echo "Bad weather!!";;
*)
echo "Sorry, $YES_OR_NO not recognize. Enter yes or no"
return ;;
esac
循环
foreach----遍历 for/do/done
for sth in $@ ;do
done
#! /bin/bash
echo "Enter Yes or No"
for FILENAME in $(ls); do
printf "$FILENAME "
if [ -f "$FILENAME" ];then
echo " "$FILENAME" is a file"
else
echo "It is not a file"
fi
done
while []; do
done
#! /bin/bash
count=3
echo "Enter password"
read TRY
while [ "$TRY" != "secret" -a $count -gt 0 ]
do
count=$[count-1]
echo "Sorry ,try again"
read TRY
done
read
read -p 读取控制台输入的值并赋予num1
read -p "please write a num " NUM1
echo "you write num is $NUM1"
-t是在规定时间为10秒内没有输入时就会直接执行下面的语句
read -t 10 -p "please write a num " NUM2
echo "the else num is $NUM2"
G.函数构建
#! /bin/bash
#一次创建多个目录,目录名字从参数中传进取,脚本测试目录是否存在,如果不存在,先打印不存在的信息然后创建该目录
is_directory()
{
DIR_NAME=$1
#从参数中判断
if [ ! -d $DIR_NAME ]; then
#如果文件存在则返回
return 1
else
return 0
fi
}
#命令行参数调用
for DIR in "$@"; do
if is_directory "$DIR";then
echo "file have already created "
else
echo "$DIR doesn't exist. Create it now..."
#标准输出重建到黑洞里面不管创建成功还是失败他都会重定向到黑洞里面
mkdir $DIR > /dev/null 2>&1
#创建失败则退出程序
if [ $? -ne 0 ]; then
echo "Can't create directory $DIR"
exit 1
fi
fi
done
H.位置参数和特殊变量!!!
$0 获取执行文件名字
$n n取1-n 表示执行文件传入的参数
$# 获取参数的总数量
$* 一行打印所有的参数
$@ 打印n行n个参数用于for 语句
$? 打印上次执行的结果
$$ 打印执行的脚本的PID
shift 将参数左边移动
echo -n "hello\n"不解析转义字符
echo -e “hello\n” 解析转义字符
G.管道和文件重定向
tee
ps aux | grep init | tee out ====>筛选出来的信息存进out 的文件里面,并且显示在屏幕上面
cmd > file
cmd >> file
cmd > file 2>&1 >后面没有空格=>将输出重定向为标准输入=>内容给文件
cmd < file >file2 === <将file的内容重定向到屏幕上面在重定向到file2里面
wc -l test_if_case.sh > out
cat < test_if_case.sh > out
cmd < &fd ========>把文件描述符当作标准输入
cmd > &fd ========>把文件描述符号当作标准输出
cmd < &- 关闭标准输出