shell入门
1.变量
1)定义变量 slbl=hb //变量名只能用字母数字下划线 for filename in `ls /etc` // 赋值为/etc下所有文件名 for filename in $(ls /etc) 2)使用变量 echo ${slbl} 或 echo $slbl //输出变量 for skill in Ada Coffe Action Java; do echo "I am good at ${skill}Script" done //循环输出变量 3)只读变量 readonly zdbl //变量值不能修改 4)删除变量 unset slbl shell字符串 //字符串有单引号和双引号 单引号里不能加转义符 双引号里面可以 str1='hb' str2="hb\"$str1\"!" echo ${#str1} //获取字符串长度 echo ${str2:1:4} //截取下标1长度4字符串 echo `expr index "$str2" io` //获取字符串中字符i或o第一个出现的下标 shell数组 array_name=(value0 value1 value2 value3)或 array_name[0]=value0 array_name[1]=value1 array_name[n]=valuen valuen=${array_name[n]}//读取数组 length=${#array_name[@]}//取得数组元素的个数 或者 length=${#array_name[*]} lengthn=${#array_name[n]}//取得数组单个元素的长度
${my_array[*]} //数组所有元素
或${my_array[*]}
2.传递参数
./xx.sh 1 2 3 //执行脚本时加上参数 脚本中echo $0 //$0是脚本名称xx.sh echo $1 //$1是第一个参数1 $2 $3等依此类推 $# //参数个数 这里是3 $* //以一个字符串显示所有参数 空格隔开 $@ //以多个字符串形式显示参数 例: echo "-- \$@ 演示 ---" for i in "$@"; do echo $i done
3.基本运算符
1)算数运算expr val=`expr 2 + 2` //expr 表示计算 2与+间要有空格 ``是反引号不是'' 例:`expr $a + $b` //加法 `expr $a - $b` //减法 `expr $a \* $b` //乘法 乘法需要用\转意符 `expr $b / $a` //除法 `expr $b % $a` //取余 a=$b //赋值 [ $a == $b ] //判断是否相等 [ $a != $b ] //判断是否不相等 2)关系运算 //只支持数字 不支持字符串 [ $a -eq $b ] //是否相等 [ $a -ne $b ] //是否不相等 [ $a -gt $b ] //是否大于 [ $a -lt $b ] //是否小于 [ $a -ge $b ] //是否大于等于 [ $a -le $b ] //是否小于等于 3)字符串运算 //支持字符串 [ $a = $b ] //是否相等 [ $a != $b ] //是否不相等 [ -z $a ] //字符串长度是否为0 0返回true [ -n "$a" ] //字符串长度是否不为0 不为0返回true [ $a ] //字符串是否为空 不为空返回true 4)逻辑运算符 [[ $a -lt 100 && $b -gt 100 ]] //&&与 [[ $a -lt 100 || $b -gt 100 ]] //||或 5)文件测试运算符 (是返回true) [ -b $file ] //文件是否是块设备文件 [ -c $file ] //文件是否是字符设备文件 [ -d $file ] //文件是否是目录 [ -f $file ] //文件是否是普通文件(既不是目录,也不是设备文件) [ -g $file ] //文件是否设置了 SGID 位 [ -k $file ] //文件是否设置了粘着位(Sticky Bit) [ -p $file ] //文件是否是有名管道 [ -u $file ] //文件是否设置了 SUID 位 [ -r $file ] //文件是否可读 [ -w $file ] //文件是否可写 [ -x $file ] //文件是否可执行 [ -s $file ] //文件是否为空(文件大小是否大于0) [ -e $file ] //文件(包括目录)是否存在
4.test命令
//用于检查某个条件是否成立,它可以进行数值、字符和文件三个方面的测试 1)数值测试(只适用于数字对比) -eq //等于则为真 -ne //不等于则为真 -gt //大于则为真 -ge //大于等于则为真 -lt //小于则为真 -le //小于等于则为真 例: if test $[num1] -eq $[num2] then echo '两个数相等!' else echo '两个数不相等!' fi 2)字符串测试(只适用于字符串对比) = //等于则为真 != //不相等则为真 -z 字符串 //字符串的长度为零则为真 -n 字符串 //字符串的长度不为零则为真 例: if test $num1 = $num2 then echo '两个字符串相等!' else echo '两个字符串不相等!' fi 3)文件测试 -e 文件名 //如果文件存在则为真 -r 文件名 //如果文件存在且可读则为真 -w 文件名 //如果文件存在且可写则为真 -x 文件名 //如果文件存在且可执行则为真 -s 文件名 //如果文件存在且至少有一个字符则为真 -d 文件名 //如果文件存在且为目录则为真 -f 文件名 //如果文件存在且为普通文件则为真 -c 文件名 //如果文件存在且为字符型特殊文件则为真 -b 文件名 //如果文件存在且为块特殊文件则为真 例:if test -e ./bash then echo '文件已存在!' else echo '文件不存在!' fi
5.shell流程控制
1)if 例: if [ $(ps -ef | grep -c "ssh") -gt 1 ] then echo "true" elif echo "xx" else echo "xxx" fi 2)for循环 例: for loop in 1 2 3 4 5 do echo "The value is: $loop" done 3)while循环 例: int=1 while(( $int<=5 )) do echo $int let "int++" done 4)until循环 //until 循环执行一系列命令直至条件为 true 时停止。 //false继续执行 与while相反 例: a=0 until [ ! $a -lt 10 ] do echo $a a=`expr $a + 1` done 5)case //case匹配某一项执行 例: echo '输入 1 到 4 之间的数字:' echo '你输入的数字为:' read aNum case $aNum in 1) echo '你选择了 1' ;; 2) echo '你选择了 2' ;; 3) echo '你选择了 3' ;; 4) echo '你选择了 4' ;; *) echo '你没有输入 1 到 4 之间的数字' ;; esac
6.函数
例: demoFun(){ echo "这是我的第一个 shell 函数!" } echo "-----函数开始执行-----" demoFun echo "-----函数执行完毕-----" 还有几个特殊字符用来处理参数 $# //传递到脚本或函数的参数个数 $* //以一个单字符串显示所有向脚本传递的参数 $$ //脚本运行的当前进程ID号 $! //后台运行的最后一个进程的ID号 $@ //与$*相同,但是使用时加引号,并在引号中返回每个参数。 $- //显示Shell使用的当前选项,与set命令功能相同。 $? //显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。
7.输入输出重定向
以下的>>//合并原文件 和>//覆盖原文件 可以替换 1)输出重定向 //输出到文件中 $ echo "菜鸟教程:www.runoob.com" > users $ cat users 菜鸟教程:www.runoob.com 如果不希望文件内容被覆盖,可以使用 >> 追加到文件末尾,例如: $ echo "菜鸟教程:www.runoob.com" >> users $ cat users 菜鸟教程:www.runoob.com 菜鸟教程:www.runoob.com 2)输入重定向 //从文件获取输入 例://统计users文件行数 wc -l users 或 wc -l < users 3)输出错误文件 command 2>>file //输出错误文件 2表示错误文件 1输出文件 0输入文件 command >> file 2>&1 //将 输出文件 和 错误文件 合并后重定向到file