linux shell脚本简明笔记教程

1. 变量定义和引用

=两边不能有空格
使用$变量名来引用变量值,也可以用${变量名}

a=1
b='str'

echo $a $b ${a} ${b}

2. IF语句

2.1 基本格式

if <测试条件>
then <语句1>
else <语句2>
fi
if <测试条件1>
then <语句1>
elif <测试条件2>
then <语句2>
else <语句3>
fi

一个分支执行多条命令

if <测试条件>
then
语句1
语句2
else
语句3
...
语句n
fi

if, then, else, fi等都是关键字,不能放在同一行,如果在同一行要用;隔开,如下

if 测试条件 ; then 语句1 ;else 语句2; fi

2.2 测试条件

if只能根据命令返回值是否为0进行判断,linux提供了test命令方便进行各种条件判断,test的别名就是方括号

  • 普通命令
  • test命令
  • [ ] 或[[ ]]

注意

  • 任意普通命令只要执行成功(返回值是0)则条件成立
  • test命令和 [ ]等价,即[ expr ]等价于test expr
  • 对于单方括号,[ 和 ] 的左右两边必须有空格

2.2.1 普通命令

if ls | grep hello; then
	echo "hello exist."
else
	echo "no file contanis hello"
fi

2.2.1 test命令和方括号

test命令和方括号是等价的,比如

test $a = $b
# 等价于
[ $a = $b ]

实际上左方括号[ 也是一个普通的可执行程序,中间都是他的参数,只是最后一个参数必须是右方括号。test命令根据条件做出判断,决定返回0或者非0,在if条件中实际上还是在看该命令的返回值。

test表达式主要用来文件、字符串、整数判断
表达式的运算符和数值之间空格能有则有,千万别省,除非是赋值语句

文件判断:

-f 文件名 检测普通文件是否存在
-d 文件名 是否为目录
-r 文件名 是否有读权限
-w 文件名 是否有写权限
-x 文件名 是否有执行权限
举例子:

if [ -f "/etc/hosts" ];then
	echo "File exists."
else
	echo "File not exists."
fi

字符串判断:

s1 = s2 s1与s2相等,则true
-n s1 字符串不空则true
-z s1 字符串空则true
s1 > s2 , ASCII比较,[]需要把<转义为\<, [[]]中无需转义
s1 < s2 同上
举例子:

if [ "${a}" = "${b}" ];
	echo "Str equal"
else
	echo "Str not equal"
fi

注意:判断是否相等可以是=,也可以是==。但注意两边必须有空格。如果=是赋值,则=两边不能有空格。
大于小于号在test表达式中需要转义,在[[]]表达式中不用转义

[ $a \< $b]
[[ $a < $b ]]

整数判断

int1 -eq int2 两个整数相等,则true
int1 -le int2 int1小于等于int2,则true
-lt 小于
-ge 大于等于
-gt 大于
整数判断千万不要直接用大于小于号,要是想用需要用双括号括起来,如:

a=105
b=15
if (($a < $b))
then ...
else ...
fi

if [ $a -gt $b ];then ...;fi

逻辑运算

! 非
-a 逻辑与(and)
-o 逻辑或(or)

[ -f "$1" -a -x "$1" ]

正则表达式

=~用来正则表达式匹配,左边是字符串,需要用引号,右边是正则表达式,不要引号。只要能匹配就是true。详见man bash
例如:

if [[ " MRPC RTE STSB CoLA " =~ MRPC ]]; then
    echo .....
fi

3. 数组

定义数组:

glue_low=(MRPC RTE STSB CoLA)

获取数组元素:

# 赋值
glue_low[0]
glue_low[1]=SST
# 读取
task=${glue_low[2]}

获取数组所有元素:

${glue_low[@]}
${glue_low[*]}

set

set -...: 开启某选项
set +...: 关闭某选项
set -o [option]: 具体设置某选项/输出所有选项的值
set -e: 出错就终止
set -u: 遇到未定义变量也终止
set -o pipefail: 管道中有错也停止
set -x: 开启命令回显
set +x: 关闭命令回显

一般脚本设置:set -euo pipefail

4. 数学算数表达式

let a=3+3
或
a=$((3+3))
# a=6

b=8
a=$(($b+1))
# a=9

5. 单引号中转义单引号

由于反斜杠在单引号里面变成了普通字符,所以如果单引号之中,还要使用单引号,不能使用转义,需要在外层的单引号前面加上一个美元符号($),然后再对里层的单引号转义。

# 不正确
$ echo it's
# 不正确
$ echo 'it\'s'
 
# 正确
$ echo $'it\'s'

不过,更合理的方法是改在双引号之中使用单引号。

$ echo "it's"
it's
$ echo $'it\'s'
it's
$
posted @ 2022-02-10 11:13  王冰冰  阅读(41)  评论(0编辑  收藏  举报