八、Shell echo命令
你可以直接在终端输入这样的单行命令来测试学习,不用一直创建新的文件。
1)显示普通字符串
echo "hello world"
这里的双引号完全可以省略,以下命令与上面实例效果一致:
echo hello world
完整演示如下:
2)显示转义字符
echo "\"hello world\""
演示如下:
3)显示换行
使用\n换行:
echo -e "hello\n"
演示如下:
4)显示不换行
echo -e "chuan! \c" # -e 开启转义 \c 不换行
演示:
5)显示结果重定向至文件
定向至test7.sh文件:
echo "hello world" >test7.sh
演示:
6)显示执行时间
echo `date`
演示:
这里又到了最后了,补充一下printf跟echo命令是一样的作用,因此我就不演示了,统一用echo来输出。
九、Shell test 命令
1)数值测试
参数和说明如下:
-eq 等于则为真 -ne 不等于则为真 -gt 大于则为真 -ge 大于等于则为真 -lt 小于则为真 -le 小于等于则为真
演示一个参数如下:
num1=200 num2=200 if test $[num1] -eq $[num2] then echo '两个数相等!' else echo '两个数不相等!' fi
即:
完整演示如下:
到这里我先把前面创建的文件删了:
rm -rf test1.sh test2.sh test3.sh test4.sh test5.sh test6.sh test7.sh test8.sh
演示:
代码中的 [] 执行基本的算数运算,例如:
a=10 b=10 result=$[a+b] # 注意等号两边不能有空格 echo "result結果为: $result"
完整演示如下(我新建了一个文件夹,免得打乱了):
我仅仅演示了加法,你也可以去尝试一些别的计算。
2)字符串测试
参数如下:
= 等于则为真 != 不相等则为真 -z 字符串 字符串的长度为零则为真 -n 字符串 字符串的长度不为零则为真
演示一个如下:
num1="chuan" num2="chuan" if test $num1 = $num2 then echo '两个字符串相等!' else echo '两个字符串不相等!' fi
即:
完整演示如下:
3)文件测试
参数:
-e 文件名 如果文件存在则为真 -r 文件名 如果文件存在且可读则为真 -w 文件名 如果文件存在且可写则为真 -x 文件名 如果文件存在且可执行则为真 -s 文件名 如果文件存在且至少有一个字符则为真 -d 文件名 如果文件存在且为目录则为真 -f 文件名 如果文件存在且为普通文件则为真 -c 文件名 如果文件存在且为字符型特殊文件则为真 -b 文件名 如果文件存在且为块特殊文件则为真
举一个例子:
if test -e ./test1.sh then echo '文件已存在!' else echo '文件不存在!' fi
完整演示如下:
其它参数可以自行测试。
十、shell 控制流
1)if判断流
if else
fi
语法格式如下:
if condition then command1 command2 ... commandN fi
举个例子:
-gt 大于则为真
测试代码如下:
a=5 b=6 if test [$a -gt] then echo '大於' else echo '小於' fi
完整演示如下:
再来进阶测试代码如下:
a=5 b=6 if test [$a==$b] then echo '等於' elif [ $a -gt $b ] then echo "a 大于 b" elif [ $a -lt $b ] then echo "a 小于 b" else echo "没有符合的条件" fi
完整演示如下:
2)for 循环
语法:
for var in item1 item2 ... itemN do command1 command2 ... commandN done
写成一行则是:
for var in item1 item2 ... itemN; do command1; command2… done;
举例子如下:顺序输出当前列表中的数字
for a in 1 2 3 4 5 do echo "值依次爲: $a" done
完整演示如下:
我们再来个进阶:打印任意数的乘法表
echo "输入一个数:" read num for (( i=1;i<=$num;i++ )) do for (( j=1;j<=$num;j++ )) do [ $j -le $i ] && echo -n "${i}*${j}=$((i*j)) " #判断j是否小于i,当 j大于i时不输出,输出不换行,末尾加一个制表符 done echo "" #输出一个换行符 done
完整演示如下:
3)while循环
语法格式:
while condition do command done
举例为:依次输出1到6
int=1 while(( $int<=6 )) do echo $int let "int++" done
完整演示如下:
4)until 循环
until 循环执行一系列命令直至条件为 true 时停止。until 循环与 while 循环在处理方式上刚好相反。
语法为:
until condition do command done
condition 一般为条件表达式,如果返回值为 false,则继续执行循环体内的语句,否则跳出循环。
举个例子:使用 until 命令来输出 0 ~ 6 的数字
a=0 until [ ! $a -lt 6 ] do echo $a a=`expr $a + 1` done
完整演示如下:
5)case … esac
case … esac 为多选择语句,与C语言中的 switch … case 类似,每个 case 分支用右圆括号开始,用两个分号 ;; 表示 break,即执行结束.
语法为:
case 值 in 模式1) command1 command2 ... commandN ;; 模式2) command1 command2 ... commandN ;; esac
举例:提示输入 1 到 4,与每一种模式进行匹配
echo '输入 1 到 4 之间的数字:' echo '你输入的数字为:' read a case $a in 1) echo '你选择了 1' ;; 2) echo '你选择了 2' ;; 3) echo '你选择了 3' ;; 4) echo '你选择了 4' ;; *) echo '你没有输入 1 到 4 之间的数字' ;; esac
6)跳出循环
break
break命令允许跳出所有循环(终止执行后面的所有循环)。
测试代码如下:
do echo -n "输入 1 到 5 之间的数字:" read aNum case $aNum in 1|2|3|4|5) echo "你输入的数字为 $aNum!" ;; *) echo "你输入的数字不是 1 到 5 之间的! 游戏结束" b
完整演示如下:
continue
continue命令与break命令类似,只有一点差别,它不会跳出所有循环,仅仅跳出当前循环。
测试代码为:
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
完整演示如下:
是不是有人想问我怎么结束呢?ctrl+c强制结束即可。