Shell脚本的基础知识总结

shell脚本是利用shell的功能所写的一个【程序】。这个程序是使用纯文本文件,将一些shell的语法与命令(含外部命令)写在里面,搭配正则表达式、管道命令与数据流重定向等功能,以达到我们所想要的处理目的。

编写第一个脚本并执行

编写脚本之前,需要先了解以下的注意事项:

  • 命令是从上而下,从左向右地分析与执行;
  • 命令、选项与参数间多个空格都会被忽略掉;
  • 空白行也会被忽略,【tab】键产生的空白视为空格键;
  • 读取到Enter符号,就开始执行该行命令;
  • 一行内容太多,则可以\[Enter]来扩展下一行;
  • 【#】之后的内容皆为注释

shell执行的几种方式

  1. 直接命令执行:前提是shell.sh文件必须具备可读与可执行(rx)权限;
  2. 绝对路径:如/home/wj/shell.sh;
  3. 相对路径:如./shell.sh
  4. 变量【Path】功能:将shell.sh放在PATH指定的目录内
  5. 以bash程序来执行:如bash shell.shsh shell.sh

编写第一个脚本

1
2
3
4
5
6
7
8
9
#!/bin/bash
# program:
# this program shows "hello world!" in screen.
# history:
# 2019/12/26 qixige first release
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH
echo -e "hello world! \a \n"
exit 0

程序说明:

  1. #!/bin/bash:声明该脚本使用的shell名称
  2. 【#】注释部分:通常说明 内容与功能、版本信息、作者与联络方式、建文件日期、历史记录等
  3. PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin export PATH:主要环境变量声明
  4. echo -e "hello world! \a \n":主程序部分
  5. exit 0执行结果(定义返回值)

脚本的执行方式差异(source、sh script、./script)

直接命令执行的方式(无论是绝对路径/相对路径还是${PATH}内,或是利用bash(或sh))来执行脚本时,该脚本都会使用一个新的bash环境来执行脚本内的命令;换句话说,就是采用直接命令的执行方式,脚本是在子进程中执行,当子进程执行完成后,在子进程中的变量或操作将会结束而不会传回到父进程中。

利用source来执行,则该脚本就在父进程中执行。

判断式

利用test命令测试功能

  1. 关于某个文件名的【文件类型】判断,如 test -e filename表示存在否

    测试的参数 意义
    -e 读【文件名】是否存在
    -f 读【文件名】是否存在且为文件
    -d 读【文件名】是否存在且为目录
    -b 读【文件名】是否存在且为block device设备
    -c 读【文件名】是否存在且为character device设备
    -S 读【文件名】是否存在且为socket文件
    -p 读【文件名】是否存在且为一个FIFO(pipe)文件
    -L 读【文件名】是否存在且为链接文件
  2. 关于文件权限检测,如test -r filename表示可读否(root权限常有除外)

    测试的参数 意义(检测文件是否存在)
    -r 且有【可读】权限
    -w 且有【可写】权限
    -x 且有【可执行】权限
    -u 且有【SUID】属性
    -g 且有【SGID】属性
    -k 且有【Sticky bit】属性
    -s 且为【非空文件】
  3. 两个文件之间的比较,如:test file1 -nt file2

    测试的参数 意义
    -nt 判断 file1 比 file2 新
    -ot 判断 file1 比 file2 旧
    -ef 判断 file1 和 file2 一样
  4. 两个整数之间的判定,如:test n1 -eq n2

    测试的参数 意义
    -eq ==
    -ne !=
    -gt >
    -lt <
    -ge >=
    -le <=
  5. 判定字符串的数据

    测试的参数 意义
    test -z string 判断字符串是否为0,若string为空,则返回true
    test -n string 判断字符串是否为非0,若string为空,则返回false
    test str1 == str2 str1与str2相等,相等则返回true
    test str1 != str2 str1与str2不相等,相等则返回false
  6. 多重条件判定,如:test -r file1 -a -x filename

    测试的参数 意义
    -a (and)两条件同时成立
    -o (or)两条件任何一个成立
    ! 反向状态

利用判断符号[]

中括号的使用地方很多,如果要在bash的语法中使用中括号作为shell的判断式时,注意 中括号的两端需要有空格符来分隔

1
2
["$HOME"=="$MAIL"] ## 错误
[ "$HOME" == "$MAIL" ] ## 正确

值得注意的是

  • 在中括号[]内的每个组件都需要有空格来分隔
  • 在中括号[]内的变量,最好都以双引号括号括起来
  • 在中括号[]内的常数,最好以单引号或双引号括起来

shell脚本的默认变量($0、$1…)

脚本针对参数已经设置好了一些变量名称,如:

1
2
/path/to/scriptname opt1 opt2 opt3 opt4
$0 $1 $2 $3 $4

还有一些特殊的变量,在脚本内可以调用:

  • $#:代表后接的参数【个数】,以上例显示为【4】
  • $@:代表【 “$1” “$2” “$3” “$4” 】之意,每个变量是独立的(用双括号引起来)
  • $*:代表【 “$1c$2c$3c$4”】, 其中c为分隔字符,默认为空格

shift:造成参数变量号码偏移

shift会移动变量,而且shift后可以接数字,表示拿掉最前面的几个参数的意思。

1
2
3
4
5
6
7
[amrcloud@yun19 bin]$ sh how_paras.sh one two three four five six
Total parameter number is ==> 6
1 Your whole parameter is ==> 'one two three four five six'
Total parameter number is ==> 5
1 Your whole parameter is ==> 'two three four five six'
Total parameter number is ==> 4
1 Your whole parameter is ==> 'three four five six'

条件判断式

利用 if…then

单层、简单条件判断式

1
2
3
if [ 条件判断式 ]; then
# 当条件判断式成立时,可以进行的命令工作内容
fi

多重、复杂条件判断式

1
2
3
4
5
6
7
if [ 条件判断式一 ]; then
# 判断式一成立时,可执行的命令
elif [ 条件判断式二 ]; then
# 判断式二成立时,可执行的命令
else
# 当判断式一和二都不成立时,可执行的命令
fi

利用 case…esac判断

1
2
3
4
5
6
7
8
9
10
11
case $变量名 in
"第一个变量内容")
# 程序段
;;
"第二个变量内容")
# 程序段
;;
*)
# 不包含第一个变量与第二个变量内容的其它程序段
;;
esac

利用 function 功能

1
2
3
4
5
function fname() {
# 程序段
}
# 函数调用,直接输入函数名即可。如
fname

注意:因为shell脚本的执行方式是由上而下、由左而右,因此在shell脚本当中的function的设置一定要在程序的最前面。

循环(loop)

while do done、util do done(不定循环)

while do done:当condition条件成立时,就进行循环,直到condition的条件不成立才停止。

1
2
3
4
while [ condition ]
do
# 程序段
done

until do done:当condition条件成立时,就终止循环,否则就持续进行循环的程序段。

1
2
3
4
until [ condition ]
do
# 程序段
done

for … do … done (固定循环)

1
2
3
4
for 循环变量名 in 变量1 变量2 变量3 ...
do
程序段
done

for … do … done 的数值处理

1
2
3
4
for (( 初始值; 限制值; 赋值运算 ))
do
# 程序段
done

括号内三串内容意义:

  • 初始值:某个变量在循环当中的起始值;如 i=1
  • 限制值:当变量的值在这个范围值得范围内,就继续进行循环;如 i < 100
  • 赋值运算:每做一次循环时,变量也变化,如: i = i + 1

shell脚本得跟踪与调试

1
sh [-nvx] script.sh

参数说明:

  • -n:不要执行脚本,仅查询语法的问题
  • -v:再执行脚本前,先将脚本文件的内容输出到屏幕上
  • -x:将使用到的脚本内容显示到屏幕上

参考资料

《鸟哥的LINUX私房菜》

-------------本文结束感谢您的阅读-------------

本文标题:Shell脚本的基础知识总结

文章作者:Mr.wj

发布时间:2019年12月29日 - 14:28

最后更新:2019年12月29日 - 14:39

原始链接:https://www.wjqixige.cn/2019/12/29/Shell脚本的基础知识总结/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

Mr.wj wechat
欢迎您扫一扫上面的微信公众号,订阅我的博客!