Linux上层应用-->Shell scripts基础规范

Shell scripts 的基本格式:

1、文件开头加入shell类型指定: #!/bin/bash

2、注释使用'#',仅支持单行注释

3、语句结尾没有分号

4、参数及命令多用空格分隔

Shell scripts 中可以取得的默认特殊变量:

${0}:当前运行脚本的文件名

${n}:n为数字大于或等于1,代表当前脚本输入的第n个参数的内容。

${#}:传递给脚本或函数的参数个数。

${*}:传递给脚本或函数所有参数的集,当被双引号包含时(也就是“${*}”),参数集输出会是一个整体(也就是"${1} ${2}...")。

${@}:传递给脚本或函数所有参数的集,双引号包含还是不包含输出结果一样。

${?}:上一个命令执行后的输出状态,返回0表示执行成功,否则失败。

${$}:当前运行脚本进程ID。

变量的替换原则:

${val:-new}:若变量不存在,返回new且不改变val

${val:=new}:若变量不存在,返回new且改变val

${val:?new}:若变量不存在,返回new到stderr且不改变val

${val:+new}:若变量不存在,创建val。否则返回new

运算符:

算术运算符

 算术运算使用格式$((运算内容)),比如:$((${a}+${b}))

注意:上面的运算格式,仅仅支持整数运算,浮点运算需要通过bc、awk等工具实现!

目前支持的算术运算符如下(与c/c++运算符一样):

+:加法

-:减法

*:乘法

/:除法

%:取余

=:赋值

关系运算符

注意:

1、关系运算符也仅仅支持整数运算

2、[]与其中的组件都需要有空格分隔,如[ "a" == "b" ]

3、组件必须用双引号包含!如[ "${a}" == "b" ]

目前支持的关系运算符如下(满足关系返回true,否则会false):

==:相等

!=:不相等

-eq:(equal)相等

-ne:(not equal)不相等

-gt:(greater than)左值是否大于右值

-lt:(less than)左值是否小于右值

-ge:(greater than or equal)左值是否大于或等于右值

-ls:(less than or equal)左值是否小于或等于右值

布尔运算:

!:非运算,逻辑结果取反

-a:(and)与运算,两个表达式都为真才返回true

-o:(or)或运算,两个表达式其中一个为真就返回true

字符串运算符:

=:是否相等

!=:是否不等

-z:(zreo)是否为空

-n:是否不为空

文件测试运算符:

-e:文件是否存在

-f:是否为普通档案

-d:是否为目录

-b:是否为块设置

-c:是否为字符设备

-S:是否为Socket文件

-p:是否为管道(FIFO)文件

-L:是否为链接

-r:是否有读权限

-w:是否有写权限

-x:是否有执行权限

-u:是否有SUID属性

-g:是否有SGID属性

-k:是否有粘着位(Sticky bit)

-s:是否存在且为非空档案

-nt:(newer than)左边档案是否比右边档案新

-ot:(older than)左边档案是否比右边档案旧

-ef:左右是否为同一档案,在判断硬链接比较有用

字符串:

获取字符串长度: echo ${#val} (在val前面加#)

提取字符串: echo ${val:n:m}(提取字符串n到m之间的字符串,以0开始)

数组:

注意:目前Shell仅仅支持一维数组,也是从下标0开始

定义数组:val=(val0 val1 val2...) (用空格隔开元素)

单独改变: val[n]=val0

读取元素:valn=${val[n]} (若不带下标,默认是0号元素,使用@或*获取全部元素)

printf:

printf用法与c/c++类似,但是格式不一样:

printf  format-string  [arguments...]

format-string->使用双引号,与C一样

arguments->参数之间用空格做分隔

if else :

与c/c++逻辑类似,格式略不同:

if [ expression ] (注意[]中的空格分离)

then

   ......

fi

 

if [ expression ] (注意[]中的空格分离)

then

  ......

else

  ......

fi

 

if [ expression ] (注意[]中的空格分离)

then

  ......

elif [ expression ] (注意[]中的空格分离)

then

 ......

else

 ......

fi

case ...esac :


与c/c++逻辑一样,根据val值匹配val1..valn,若无匹配则跳转到*选项,每个选项以;;结尾。

当多个选项输出同一结果时,用'|'组合。

 1 case val in
 2 
 3  val1)
 4 
 5     ;;
 6 
 7  val2)
 8 
 9     ;;
10 
11   *)
12 
13     ;;
14 
15 esac

for循环:

1 for 变量 in 列表
2 do
3 command1
4 command2
5 ...
6 commandN
7 done

列表是一组值(数字、字符串等)组成的序列,每个值通过空格分隔。每循环一次,就将列表中的下一个值赋给变量。

in 列表是可选的,如果不用它,for 循环使用命令行的位置参数。

注意:列表可以使用通配符等技巧,实现多种参数输入

while循环:

1 while command
2 do
3 
4   ....
5 
6 done

当command执行命令为真,就执行do中内容

until循环:

until循环逻辑与while相反,command为假就执行内容

1 until command
2 
3 do
4 
5   ......
6 
7 done

跳出循环:

break后可以接数字,代表跳出到第几层循环。若不接数字,默认跳出到最大循环。若数字大于最大循环,则跳出最大循环。

continue代表直接进入下一次循环,和c/c++一样。

函数:

1 FunctionName()
2 {
3   .........
4 }

注意:

1、函数名括号中不能带有参数。

2、函数也有返回值,同样通过${?}取得

3、调用函数直接输入函数名,但后面不能跟括号

4、函数参数在函数名后输入,空格分隔各参数,${n}取第n个参数,从1开始

文件调用:

bash也可以包含其他shell文件,使用格式:

source File
或
. File(注意空格)

shell scripts 调试:

使用sh [-nvx] file.sh命令调试脚本

-n:不执行scripts,仅检查语法

-v:先将scripts内容输出到屏幕上,再执行

-x:将scripts执行过程中使用到的内容都输出到屏幕上

原文地址:https://www.cnblogs.com/KcMeterCEC/p/5361681.html