shell 第二篇

106 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

五、脚本语法

1. test

  • 用于检测文件类型,数值(字符串,数字)

  • test -e file1, 此时测试文件是否存在,使用echo $? 来打印执行结果,0:代表真,非0,:代表假

  • 使用[ -e file1 ] 等同于test

1585637974816.png

  • 案例:

    #!/bin/bashecho "====> 1. 文件测试!"
    f1=test.sh
    ​
    test -e "$f1"; echo $?  #0
    test -f "$f1"; echo $? #0
    test -d "$f1"; echo $? #1
    test -d a; echo $? #0
    [ -d a ]; echo $? #0echo "====> 2. 数字测试!"
    v1=100
    v2=200
    [ $v1 -eq 100 ];echo $? #0
    #使用[ 时,一定要留出空格,否则报错
    #[$v1 -eq 100];echo $? #0
    ​
    [ $v1 -eq 100 ];echo $? #0
    [ $v1 -ne $v2 ];echo $? #0
    [ $v1 -gt $v2 ];echo $? #1
    [ $v1 -lt $v2 ];echo $? #0
    [ $v1 -ge $v2 ];echo $? #1
    [ $v1 -le $v2 ];echo $? #0#下面这种>写法,语法执行时没有报错,但是处理的结果是错的,需要慎重
    [ $v1 > $v2 ];echo $? #0echo "====> 3. 字符串测试!"
    name="duke !"
    [ -z "$name" ];echo $?  #1   当name为空时,返回true
    [ ! -z "$name" ];echo $?  #0
    [ -n "$name" ];echo $? #0 当name非空时,返回true
    ​
    name1=""
    [ -z $name1 ];echo $?
    #[ -n "$name" ];echo $?
    [ -n "$name1" ];echo $?  #该案例中,如果不加引号,判断是错误的
    ​
    name2="lily !"
    #在shell的条件判断中,=不是赋值,而是等同于==
    [ "$name" = "$name2" ]; echo $?  #1
    #[ "duke !" = "lily !" ]
    #[ duke ! = lily ! ] #不加的效果
    [ "$name" != "$name2" ]; echo $?  #0
    ​
    ​
    echo "===》 与或非"
    [ -f test.sh -a  -z "$name2" ] ;echo $? #1
    [ -f test.sh -o  -z "$name2" ] ;echo $? #0
    [ ! -z "$name2" ] ;echo $? #0
    

如果不加双引号报错如下:

1585637746234.png

公司项目工程示意:

src  internal external test build.sh 
​
./build.sh debug
./build.sh release

2. if test

  1. 基本语法:
#!/bin/bash
​
f1="if.sh"if [ -d "$f1" ];then
    echo "$f1 is a file"
elif [ -x "$f1" ]; then
    echo "$f1 有执行权限!"
else
    echo "$f1 is not a file"
fi
​
​
if true;then
    echo "永远为真"
else
    : #代表空操作
fiif :;then
    echo "永远为真"
else
    : #代表空操作
fi
  1. if 与test配合使用,后面如果then放在下一行,则分号可以省略
  2. if必须使用fi进行结尾
  3. 冒号,代表永远为真
  1. 案例:让用户输入YES,NO进行分支处理
#!/bin/bash#echo "请问最近在找工作吗?(Y|N)"
#read YES_OR_NO#-p 是输入前的提示
read -p  "请问最近在找工作吗?(Y|N)" YES_OR_NO
​
if [ "$YES_OR_NO" = "Y" ];then
    echo "是的"
elif [ "$YES_OR_NO" = "N" ];then
    echo "不是"
else
    echo "请正确输入,Y|N"
fi
  1. -a 与 &&的区别(-o和||同理)

1585640601506.png

3. case

c语言的switch:

switch (表达式)
{
    case1:
        xxx
        break;
    case2:
        xxx
        break;
    default:
        xxxx;
}

shell:

case 表达式 in
    v1|v2)
        xxx
        ;;
    v3|v4)
        xxx
        ;;
    *)
        xxx
esac    

案例:

#!/bin/bash
​
​
read -p "灭霸同学,你集齐拯救世界的宝石没?" YES_OR_NO
​
case "$YES_OR_NO" in
    y|Y|yes|YES)  #表示里面的多个值都是满足当前分支条件的
        echo "是的,Mr杜!"
        ;; #v这两个分号必须存在
    n|N|no|NO)
        echo "抱歉先生!"
        ;;
    *)
        echo "输入无效!"
esac

4. for、while

#!/bin/bash
​
values="aaa bbb ccc ddd biu biu biu"
for i in $values
do
    echo $i
done#for i in `ls /`
#do
#    echo $i
#done#1 + 2+ ... + 100 = 5050
sum=0
for i in {1..100}; do
    #sum=$sum+$i  #这是错的,效果:1+2+3+4...
    #sum=$(($sum + $i)) #正确的
    #sum=$((sum + i))  #正确的
    sum=$[$sum+$i] #正确的
    sum=$[sum+i] #正确的
doneecho sum : $sum#shell的数组
nums=(10 20 30 40)
echo ${nums[0]}
echo ${nums[1]}
echo ${nums[2]}
echo ${nums[3]}echo "for遍历数组...."
#for i in $nums  #这种方式是错误的
for i in ${nums[*]}
do
    echo $i
done
​
i=10
while [ $i -gt 0 ]
do
    echo "$i"
    i=$[i-1]
doneif [ $? -eq 0];then
    echo "上一句命令执行成功"
fi
​
​
while true
do
    sleep 1
    echo "hello"
done

结果:

1585643083380.png

5. 特殊字符

$? : 一个程序执行完毕的返回值,用于判断程序是否执行成功,从而控制后续逻辑

$#: 获取当前脚本传入参数的个数 $@:获取当前脚本传入参数的具体数值 "aa" "bb" "cc" $*:与$@类似,但是=》 "aa bb cc" $0:当前脚本文件的名字 $1 ~ $9:依次存储每一个输入参数的变量值 shift:将用户输入的参数逐个剔除,从而使得程序控制$1即可。
#!/bin/bashecho "接收参数的数量:" $#   #argc
echo "接收参数的内容:" $@   #argv[0]之后的
echo "程序的名字:" $0 #argv[0]echo "遍历参数如下:"for i in $@  #$@用户输入参数的集合
do
    echo $i,  当前参数总个数为: $#
done#这些依次保存用户输入的参数,但是最多到$9
echo $1 $2 $3 $4 $5 $6 $7 $8 $9 $10 $11echo "使用shift命令之后....."for i in $@
do
    echo $1, 当前参数总个数为: $#
    shift #将当前的参数最左侧的剔除掉,后一个变成了第一个
done

1585644074625.png

结果:

1585644607571.png