文章目录
一、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
告诉系统说,就在当前目录找。
- 直接执行(test.sh文件必须具备可读与可执行 (rx) 的权限,可通过chmod u+x test.sh 添加可执行权限):
- 2. 作为解释器参数
- bash 执行:
bash test.sh
sh test.sh
- source 执行
source test.sh
- 和 bash 执行的区别在于:source 在父进程中执行,使环境变量在当前的 Session 中生效,而 bash 在子进程中执行,执行完后环境变量立即失效。
- 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 -x
和set +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 "完美"