Shell脚本系列(四)
目录
-
Shell脚本系列(一)
-
Shell脚本系列(二)
-
Shell脚本系列(三)
-
Shell脚本系列(四)
-
Shell脚本系列(五)
-
Shell脚本系列(六)
-
Shell脚本系列(七)
-
Shell脚本系列(八)
1、常见Shell命令
1.1、echo命令
echo命令用于字符串的输出,
1、显示普通字符串
echo "It is a test" # 或(可以省略双引号) echo It is a test
2、显示转义字符
echo "\"It is a test\"" # 结果 "It is a test"
3、显示变量
#!/bin/sh # read 命令从标准输入中读取一行,并把输入行的每个字段的值指定给 Shell 变量 read name echo "$name It is a test"
4、显示换行
echo -e "OK! \n" # -e 开启转义 echo "It is a test" 结果: OK! It is a test
5、显示不换行
#!/bin/sh echo -e "OK! \c" # -e 开启转义 \c 不换行 echo "It is a test" 结果: OK! It is a test
6、显示结果定向至文件
echo "It is a test" > myfile
7、原样输出字符串,不进行转义或取变量(单引号)
echo '$name\"' 结果: $name\"
8、显示命令执行结果
# 这里使用的是反引号 `, 而不是单引号 '。 echo `date` 结果: Thu Jul 24 10:08:46 CST 2014
9、echo总结
===================================================================
能否引用变量 | 能否引用转移符 | 能否引用文本格式符(如:换行符、制表符)
单引号 | 否 | 否 | 否
双引号 | 能 | 能 | 能
无引号 | 能 | 能 | 否
===================================================================
1.2、printf命令
printf 也是用于输出的。
printf 使用引用文本或空格分隔的参数,外面可以在 printf 中使用格式化字符串,还可以制定字符串的宽度、左右对齐方式等。默认 printf 不会像 echo 自动添加换行符,我们可以手动添加 \n。
格式:
printf format-string [arguments...]
format-string: 为格式控制字符串
arguments: 为参数列表。
%d %s %c %f 格式替代符详解:
d: Decimal 十进制整数 -- 对应位置参数必须是十进制整数,否则报错!
s: String 字符串 -- 对应位置参数必须是字符串或者字符型,否则报错!
c: Char 字符 -- 对应位置参数必须是字符串或者字符型,否则报错!
f: Float 浮点 -- 对应位置参数必须是数字型,否则报错!
#!/bin/bash # author:菜鸟教程 # url:www.runoob.com printf "%-10s %-8s %-4s\n" 姓名 性别 体重kg printf "%-10s %-8s %-4.2f\n" 郭靖 男 66.1234 printf "%-10s %-8s %-4.2f\n" 杨过 男 48.6543 printf "%-10s %-8s %-4.2f\n" 郭芙 女 47.9876 输出 姓名 性别 体重kg 郭靖 男 66.12 杨过 男 48.65 郭芙 女 47.99 # %s %c %d %f都是格式替代符 %-10s 指一个宽度为10个字符(-表示左对齐,没有则表示右对齐),任何字符都会被显示在10个字符宽的字符内,如果不足则自动以空格填充,超过也会将内容全部显示出来。 %-4.2f 指格式化为小数,其中.2指保留2位小数。
#!/bin/bash # author:菜鸟教程 # url:www.runoob.com # format-string为双引号 printf "%d %s\n" 1 "abc" # 单引号与双引号效果一样 printf '%d %s\n' 1 "abc" # 没有引号也可以输出 printf %s abcdef # 格式只指定了一个参数,但多出的参数仍然会按照该格式输出,format-string 被重用 printf %s abc def printf "%s\n" abc def printf "%s %s %s\n" a b c d e f g h i j # 如果没有 arguments,那么 %s 用NULL代替,%d 用 0 代替 printf "%s and %d \n" 结果: 1 abc 1 abc abcdefabcdefabc def a b c d e f g h i j and 0
$ printf "a string, no processing:<%s>\n" "A\nB" a string, no processing:<A\nB> $ printf "a string, no processing:<%b>\n" "A\nB" a string, no processing:<A B> $ printf "www.runoob.com \a" www.runoob.com $ #不换行
1.3、test命令
test 命令用于检查某个条件是否成立,它可以进行数值、字符和文件三个方面的测试。
1.3.1、数值测试
num1=100 num2=100 if test $[num1] -eq $[num2] then echo '两个数相等!' else echo '两个数不相等!' fi #结果 两数相等! ############################ a=5 b=6 result=$[a+b] # 注意等号两边不能有空格 echo "result 为: $result" # 结果 result 为: 11
1.3.2、字符串测试
num1="ru1noob" num2="runoob" if test $num1 = $num2 then echo '两个字符串相等!' else echo '两个字符串不相等!' fi # 结果 两个字符串不相等!
1.3.3、文件测试
cd /bin if test -e ./bash then echo '文件已存在!' else echo '文件不存在!' fi #结果 文件已存在! ###################################### # 另外,Shell 还提供了与( -a )、或( -o )、非( ! )三个逻辑操作符用于将测试条件连接起来,其优先级为: ! 最高, -a 次之, -o 最低。例如: cd /bin if test -e ./notFile -o -e ./bash then echo '至少有一个文件存在!' else echo '两个文件都不存在' fi #结果: 至少有一个文件存在!
1.4、read命令
read 命令一个一个词组地接收输入的参数,每个词组需要使用空格进行分隔;如果输入的词组个数大于需要的参数个数,则多出的词组将被作为整体为最后一个参数接收。
格式:read [-options] [variable...]
参数说明:
-p 输入提示文字
-n 输入字符长度限制(达到6位,自动结束)
-t 输入限时
-s 隐藏输入内容
# test.sh read firstStr secondStr echo "第一个参数:$firstStr; 第二个参数:$secondStr" 执行测试 $ sh test.sh 一 二 三 四 第一个参数:一; 第二个参数:二 三 四
read -p "请输入一段文字:" -n 6 -t 5 -s password echo -e "\npassword is $password" # 运行 $ sh test.sh 请输入一段文字: password is asdfgh
2、流程控制
2.1、选择
2.1.1、if else
# 格式一 if condition then command1 command2 ... commandN fi # 格式二 if condition then command1 command2 ... commandN else command fi # 格式三 if condition1 then command1 elif condition2 then command2 else commandN fi
a=10 b=20 if [ $a == $b ] then echo "a 等于 b" elif [ $a -gt $b ] then echo "a 大于 b" elif [ $a -lt $b ] then echo "a 小于 b" else echo "没有符合的条件" fi 输出: a小于b ############################ num1=$[2*3] num2=$[1+5] if test $[num1] -eq $[num2] then echo '两个数字相等!' else echo '两个数字不相等!' fi 输出: 两个数相等!
2.1.2、case
case语句为多选择语句。可以用case语句匹配一个值与一个模式,如果匹配成功,执行相匹配的命令。
case工作方式如上所示。取值后面必须为单词in,每一模式必须以右括号结束。取值可以为变量或常数。匹配发现取值符合某一模式后,其间所有命令开始执行直至 ;;。
取值将检测匹配的每一个模式。一旦模式匹配,则执行完匹配模式相应命令后不再继续其他模式。如果无一匹配模式,使用星号 * 捕获该值,再执行后面的命令。
# 格式 case 值 in 模式1) command1 command2 ... commandN ;; 模式2) command1 command2 ... commandN ;; esac
# 提示输入1到4,与每一种模式进行匹配 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 # 结果 输入 1 到 4 之间的数字: 你输入的数字为: 3 你选择了 3
while true do echo "请输入 1~9 之间的数字:"; read input; echo "你输入的数字是:${input}" case $input in 1) echo "你选择了A";; 2) echo "你选择了B";; 3|4) echo "你选择了D";; 7) echo "这是一个测试选项";; abc) echo "没有该选项";; *) echo "没有匹配的";; esac done
2.2、循环
2.2.1、for
# 格式一: for var in item1 item2 ... itemN do command1 command2 ... commandN done # 格式二: for var in item1 item2 ... itemN; do command1; command2… done;
for loop in 1 2 3 4 5 do echo "The value is: $loop" done 输出: The value is: 1 The value is: 2 The value is: 3 The value is: 4 The value is: 5 ######################### for str in 'This is a string' do echo $str done 输出: This is a string
2.2.2、while
while循环用于不断执行一系列命令,也用于从输入文件中读取数据;命令通常为测试条件
# 格式: while condition do command done
# 如果int小于等于5,那么条件返回真。int从0开始,每次循环处理时,int加1 #!/bin/bash int=1 while(( $int<=5 )) do echo $int let "int++" done # let命令 它用于执行一个或多个表达式,变量计算中不需要加上 $ 来表示变量 # 结果: 1 2 3 4 5 ############################################ echo '按下 <CTRL-D> 退出' echo -n '输入你最喜欢的网站名: ' while read FILM do echo "是的!$FILM 是一个好网站" done
2.2.3、until
until 循环执行一系列命令直至条件为 true 时停止。
until 循环与 while 循环在处理方式上刚好相反。
一般 while 循环优于 until 循环,但在某些时候—也只是极少数情况下,until 循环更加有用。
# 格式 until condition do command done
# 输出 0 ~ 9 的数字 #!/bin/bash a=0 until [ ! $a -lt 10 ] do echo $a a=`expr $a + 1` done 结果: 0 1 2 3 4 5 6 7 8 9
2.2.4、无限循环
# 格式一 while : do command done # 格式二 while true do command done # 格式三 for ((;;)))
# 格式一eg x=0 while : do if [ $x -ge 20 ] then break; fi let "x+=1"; echo "x is ${x}"; done # 格式二eg z=0 while true do if [ $z -ge 20 ] then break; fi let "z+=1"; echo "z is ${z}"; done # 格式三eg set j=0; for((;;)) do if [ $j -ge 20 ] then break; fi let "j=j+1" echo "j is ${j}" done
2.3、跳出循环
2.3.1、break
break命令允许跳出所有循环(终止执行后面的所有循环)。
#!/bin/bash while : do echo -n "输入 1 到 5 之间的数字:" read aNum case $aNum in 1|2|3|4|5) echo "你输入的数字为 $aNum!" ;; *) echo "你输入的数字不是 1 到 5 之间的! 游戏结束" break ;; esac done 结果: 输入 1 到 5 之间的数字:3 你输入的数字为 3! 输入 1 到 5 之间的数字:7 你输入的数字不是 1 到 5 之间的! 游戏结束
2.3.2、continue
continue命令与break命令类似,只有一点差别,它不会跳出所有循环,仅仅跳出当前循环。然后开始下一次的循环
#!/bin/bash while : do echo -n "输入 1 到 5 之间的数字: " read aNum case $aNum in 1|2|3|4|5) echo "你输入的数字为 $aNum!" ;; *) echo "你输入的数字不是 1 到 5 之间的!" continue echo "游戏结束" ;; esac done 运行代码发现,当输入大于5的数字时,该例中的循环不会结束,语句 echo "游戏结束" 永远不会被执行。
参考:https://www.runoob.com/linux/linux-shell.html