编写shell脚本常用的一些用法

shell脚本常用判断

shell变量

变量的赋值

注意: 赋值语句=左右不能有空格

1
2
3
4
5
# 直接赋值:
name="test"

# 语句赋值
for i in `ls` #将ls的结果作为变量值

变量的使用

1
2
3
echo $name
echo ${name}

变量的高级用法

  • 当变量没有声明时,直接使用赋予默认值,语法${var=Default}

    1
    2
    # 当name变量没有声明时,name变量的默认值是test
    echo ${name="test"}
  • 当变量没有声明或者申明的变量为空字符串时,赋予默认值,语法${var:=Default}

    1
    2
    3
    4
    name=""
    # 此时name变量的在值为空字符串,name变量的默认值是test
    echo ${name:="test"}

数字运算

数字运算的两个变量必须是数字或者数字字符串,数字运算采用的语法是$((num1 + num2))

数字运算符

符号 解释 举例
+ $((num1 + num2))
- $((num1 - num2))
* $((num1 * num2))
/ $((num1 / num2))
% 求余 $((num1 % num2))
** 乘方 $((num1 ** num2))

对于复杂运算,可以 通过括号来区分先后顺序

1
2
# 举例: 先进行num1和num2相加,在与num3相乘
$(((num1 + num2) * num3))

字符串

字符串的定义可以使用单引号,也可以使用双引号来定义
两者的区别在于
单引号字符串中引用的变量或者符合不会被解析或者转义
双引号字符串中引用则会解析或者转义

字符串定义

1
2
3
4
5
6
7
8
9
10
11
12
#!/bin/bash
#定义一个变量
name="test string"

#${name}原样输出,没有变成${name}的变量值
test_string1='this is a ${name}'
echo ${test_string1}

#${name}输出${name}的变量值
test_string2="this is a ${name}"
echo ${test_string2}

字符串连接

1
2
3
4
#将上面定义的两个字符串变量test_string1和test_string2连接起来输出

echo ${test_string1} ${test_string2}

字符串长度

1
2
3
#计算变量${test_string1}的长度
echo ${#test_string1}

截取字符串

普通截取

字符串截取下标索引从0开始

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#显示完整的字符串
echo ${test_string1}

#字符串从下标为2的位置开始输出
echo ${test_string1:2}

#字符串从下标为2的位置开始输出,并且输出长度为5
echo ${test_string1:2:5}

#从字符串从下标为-2的位置开始输出
echo ${tset_string1:(-2)}

#从字符串从下标为-2的位置开始输出,并且输出长度为5
echo ${tset_string1:(-2):5}


字符串匹配截取

分两种

  1. 从开头开始匹配,左到右
    语法:
    echo ${var#正则表达式} 截取第一个匹配到表达式后面的字符串
    echo ${var##正则表达式} 截取最后一个匹配到表达式后面的字符串
  2. 从结尾开始匹配,从右到左
    echo ${var%正则表达式} 截取从右到左第一个匹配到表达式前面的字符串
    echo ${var%%正则表达式} 截取从右到左最后一个匹配到表达式前面的字符串
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#定义一个路径变量
test_path=/usr/local/src/sa/local/sb/src

#从左向右匹配截取
echo ${test_path#*/local}
#输出结果: /src/sa/local/sb/src


echo ${test_path##*/local}
#输出结果: sb/src



#从右向左匹配截取

echo ${test_path%/local*}
#输出结果: /usr/local/src/sa

echo ${test_path%%/local*}
#输出结果: /usr

匹配截取的一个高级用法,用来快速截取路径和文件名

1
2
3
4
5
6
7
8
9
test_file=/var/www/html/index.html

#获取文件名
echo ${test_file##*/}

#获取文件路径
echo ${test_file%/*}


字符串替换

字符串内置替换功能
语法:
${变量/查找正则表单/替换值} 一个”/“表示替换第一个,”//“表示替换所有

1
2
3
4
5
6
7
8
9
10
11
test_path="/home/work/home/.vimrc"

echo ${test_path/.vimrc/.vimbashrc}
输出结果: /home/work/home/.vimbashrc

echo ${test_path/home/usr}
输出结果: /usr/work/home/.vimrc

echo ${test_path//home/usr}
输出结果: /usr/work/usr/.vimrc

逻辑判断

符号 解释
[] 中括号一般是比较
() 小括号一般是判断

字符串比较

符号 解释
= 判断两个字符串是否相等
!= 判断两个字符串不相等
-n 判断字符串长度是否大于0
-z 判断字符串长度是否为0
>,< 字符串比较大小(使用时需要加上转义字符’\‘)

数字比较

符号 解释
-eq 等于
-ne 不等于
-lt 小于
-gt 大于
-le 小于或等于
-ge 大于或等于

文件的判断

符号 解释
–b 当file存在并且是块文件时返回真
-c 当file存在并且是字符文件时返回真
-d 当pathname存在并且是一个目录时返回真
-e 当pathname指定的文件或目录存在时返回真
-f 当file存在并且是正规文件时返回真
-g 当由pathname指定的文件或目录存在并且设置了SGID位时返回为真
-h 当file存在并且是符号链接文件时返回真,该选项在一些老系统上无效
-k 当由pathname指定的文件或目录存在并且设置了“粘滞”位时返回真
-p 当file存在并且是命令管道时返回为真
-r 当由pathname指定的文件或目录存在并且可读时返回为真
-s 当file存在文件大小大于0时返回真
-u 当由pathname指定的文件或目录存在并且设置了SUID位时返回真
-w 当由pathname指定的文件或目录存在并且可执行时返回真。一个目录为了它的内容被访问必然是可执行的。
-o 当由pathname指定的文件或目录存在并且被子当前进程的有效用户ID所指定的用户拥有时返回真

复杂逻辑判断

符号 解释
-a 双方都成立(and)
-o 单方成立(or)
!

while循环