6、shell 脚本


一、shell script 介绍

1. shell 脚本介绍

  • 纯文本文件,以固定的语法组织起来,可编辑这个文件,让这个文件帮我们一次执行多个命令。 可以通过一些运算与逻辑判断来帮我们达成某些较复杂的功能。
  • 一行内容太多,使用\延伸至下一行, #后面的内容为注释,空格及空白行会被忽略。
  • 如果读取一个Enter符号(CR),就尝试开始执行该行命令。

2. 执行 shell 脚本的二种方式

  • 假设程序文件名是:/home/test_user/test.sh
  • 1. 作为可执行程序
    • 直接执行(test.sh文件必须具备可读与可执行 (rx) 的权限,可通过chmod u+x test.sh 添加可执行权限):
      • 绝对路径:运行/home/test_user/test.sh 来执行指令
      • 相对路径:cd 到 /home/test_user/,使用 ./test.sh 执行
    • Note:一定要写成 ./test.sh,而不是 test.sh,运行其它二进制的程序也一样,直接写 test.sh,linux 系统会去 PATH 里寻找有没有叫 test.sh 的,而只有 /bin, /sbin, /usr/bin,/usr/sbin 等在 PATH 里,你的当前目录通常不在 PATH 里,所以写成 test.sh 是会找不到命令的,要用 ./test.sh 告诉系统说,就在当前目录找
  • 2. 作为解释器参数
    • bash 执行:
      • bash test.sh
      • sh test.sh
    • source 执行
      • source test.sh
      • 和 bash 执行的区别在于:source 在父进程中执行,使环境变量在当前的 Session 中生效,而 bash 在子进程中执行,执行完后环境变量立即失效。

3. 新建脚本文件 shell.sh 的注意事项

  • vim test.sh 创建脚本文件
  • 首行添加#!/bin/bash,告诉系统使用 bash shell 来解释此脚本文件。当采用直接执行(不是采用类似 sh xxx.sh 这样的方式)时,此行必须添加
  • 若使用直接执行方式,则必须添加可执行权限chmod u+x test.sh

二、shell script 参数介绍

  • 比如,ls -al 其中-al 就是 shell 脚本参数,那么我们自己写的脚本参数该如何使用呢?

    # bash 中执行的命令,传入实参,直接用绝对路径执行的方式
    chmod a+x /path/to/shellscript.sh
    /path/to/shellscript.sh param1 param2 param3 param4 
        $0           $1     $2     $3     $4  
    # 编写 shellscript.sh 脚本时,其中的参数值用 $num 代替,相当于形参
    
  • 使用$ num后面加相应的数字获取相应的变量

    • $0:代表脚本程序本身
    • $1,$2,…:代表后面第一个参数,第二个参数,等等
    • $#代表后接的参数个数,以上边为例,这里显示为4
    • $@:取得所有参数的值
    • $*:代表 $1 $2 $3 $4
    • $?:显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误

三、条件判断语句

  • 多条件判断语句

    read -p "Please input (Y/N): " yn
    
    if [[ "$yn" == "Y"  ||  "$yn" == "y" ]]; then
    echo "ok, continue"
    
    elif [[ "$yn" == "N" || "$yn" == "n" ]]; then
    echo "oh, interrupt!"
    
    else
    echo "I don't know what your choice is"
    
    fi    # 将if反过来写,就成为fi 结束if语句
    # && 代表 AND,  || 代表 or  
    
  • case …esac 判断语句

    case $变量名称 in 
    "第一个变量内容") 
     程序段 
     ;;             # 双分号表示 break
                 
    "第二个变量内容") 
     程序段  
     ;;
      
    *) 
     exit 1 
     ;; 
     
    esac            # 结束标记
    
  • 函数

    # funcition 也可不加,shell 自上而下执行,所以函数需写在最前面 
    function fname() 
    {  
    	echo "第一个参数为 $1 !"
        echo "第二个参数为 $2 !"
    	return $(($1 + $2)) 
    } 
    
    fname 3 4
    echo $?
    
    第一个参数为 3 !
    第二个参数为 4 !
    7
    
    # 无参数时,调用时直接用 fname 即可
    # 有参数时,在函数体内部,通过 $n 来定义各个形参(n>10 以后需使用${n})调用时直接使用 fname pram_1 pram_2 ... pram_n 即可
    # 函数可带返回值,使用 return 实现。函数返回值在调用该函数后通过 $? 来获得。
    

四、循环语句

  • while 循环语句
    # 注意 while 和条件之间要有一个空格
    while/until [ "$yn" != "yes" -a "$yn" != "YES" ]
    do
    	read -p "Please input yes/YES to stop this program: " yn
    done
    echo "OK! you input the correct answer." 
    
  • for 循环语句
    # 范例 1
    for var in dog cat elephant
    do
    echo "There are ${var}s.... "
    done
    
    1. 第一次循环时,$var的内容为dog;
    2. 第二次循环时,$var的内容为cat;
    3. 第三次循环时,$var的内容为elephant;
    
    
    # 范例 2
    read -p "Please input a number, I will count for 1+2+...+your_input: " nu
    sum=0
    
    # 注意空格
    for (( i=1; i<=$nu; i=i+1 )) do
    sum=$(($sum+$i))
    done
    
    echo "The result of '1+2+3+...+$nu' is ==> $sum"
    
  • 跳出循环
    break        # 直接跳出循环 
    continue     # 结束当前循环,进入下一次循环
    

五、shell script 脚本调试

  • 通过 set -x 命令开启调试功能,而通过 set +x 关闭调试功能,且只针对 set -xset +x 之间的脚本进行调试

    [root@ks ~]# cat debug.sh
    #!/bin/bash
    read -p "please input two number:" a b
    set -x    #开启调试
    if (($a < $b))
      then
        echo "$a<$b"
    elif (($a == $b))
      then
        echo "$a=$b"
    else
        echo "$a>$b"
    fi
    set +x    #结束调试,只针对 set -x 和 set +x 之间的脚本进行调试
    
    echo "完美"
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值