Shell脚本基础

Shell脚本基础

一、变量

text
1
2
3
4
5
6
7
8
9
10
11
# 使用变量,建议方式
${var}
# 在变量名var后是空格时才可用如下方式
$var

# 设定只读变量
declare -r var_name
readonly var_name

# 删除变量
uset var_name

1.1 字符串变量

text
1
2
3
4
5
6
7
8
9
10
11
12
# 字符串的定义
var_string="hello world"

# 字符串的长度计算
${#var_string}

# 字符串拼接
var_string_new="${var_string} new string"

######## 字符串操作 ########
# 根据起始和截取长度截取字符串
${string_var:start_index:length}

1.2 变量赋值

text
1
2
3
4
5
6
7
8
9
10
11
# 除了显式赋值,也可以将命令的结果存入到变量,如下就是将`ls /etc`的结果存到到了file_array
file_array=$( ls /etc )

# 也可以使用` 命令 `方式
file_array=` ls /etc `

# 应用:循环访问文件
for file in $( ls /etc )
do
     # do something
done

1.3 数组变量

text
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 数组的定义
array_var=(val0 val1 val2)

# 单独定义每个元素
array_var[0]=val0
array_var[1]=val1

# 获取所有元素
${array_var[@]}

# 获取数组的长度/元素个数
${#array_var[@]}
${#array_var[*]}

# 获取单个元素长度
${#array_var[n]}

二、运算符

2.1 算数运算符

  • +、-、*、/,% 借助expr进行计算,例如expr $var1 + $var2
  • = 赋值
  • == 数字比较相等返回true,[ $var1 == $var2 ]
  • != 数字比较不相等返回true,[ $var1 != $var2 ]

2.2 关系运算符

关系运算符只用于比较数字之间的关系,不支持字符串,除非字符串的值是数字

  • eq 数字相等返回true,[ $var1 -eq $var2 ] => ==
  • ne 数字不相等返回true,[ $var1 -nq $var2 ] => !=
  • gt 左边大于右边返回true,[ $var1 -gt $var2 ] => >
  • lt 左边小于右边返回true,[ $var1 -lt $var2 ] => <
  • ge 左边大于等于右边返回true,[ $var1 -ge $var2 ] => >=
  • le 左边小于等于右边返回true,[ $var1 -le $var2 ] => <=

2.3 布尔运算符

var1=10,var2=20

  • ! 非运算,表达式为false,返回true,[ ! false ]返回true
  • o 或运算,有一个表达式为true就为true,[ $var1 -lt 20 -o $var1 -gt 100 ]返回true
  • a 与运算,所有表达式为true才是true,[ $var1 -lt 20 -a $var1 -gt 100 ]返回false

2.4 逻辑运算符

  • && :逻辑的AND
  • || :逻辑的OR
text
1
2
3
4
# 注意需要两个嵌套的中括号
if [[ ${var1} == 0 && ${var2} == 0 ]];then
    // do something
fi

2.5 字符串运算符

var1="abc",var2="efg"

  • = 检测字符串相等返回true,[ $var1 = $var2 ]返回false
  • != 检测字符串不相等返回true,[ $var1 != $var2 ]返回true
  • z 检测字符串长度为0返回true,[ -z $var1 ]返回false
  • n 检测字符串长度不为0返回true,[ -n $var1 ]返回true
  • $ 检测字符串不为空返回true,[ $var1 ]返回true
text
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
########## 字符串为空和字符串长度的运算测试 ##########
#!/bin/bash

var1=
var2=""

if [ -z $var1 ];then
   echo "var1 字符串长度为0"
else
   echo "var1 字符串长度不为0"
fi

if [ -z $var2 ];then
   echo "var2 字符串长度为0"
else
   echo "var2 字符串长度不为0"
fi

if [ -z $no_exits ];then
   echo "no_exits 字符串长度为0"
else
   echo "no_exits 字符串长度不为0"
fi

if [ $var1 ];then
   echo "var1 字符串不为空"
else
   echo "var1 字符串为空"
fi

if [ $var2 ];then
   echo "var2 字符串不为空"
else
   echo "var2 字符串为空"
fi

if [ $no_exits ];then
   echo "no_exits 字符串不为空"
else
   echo "no_exits 字符串为空"
fi

########## 输出 ##########
var1 字符串长度为0
var2 字符串长度为0
no_exits 字符串长度为0
var1 字符串为空
var2 字符串为空
no_exits 字符串为空

########## 结论 ##########
字符串长度和字符串是否为空的运算*好像*是一致的,他们有没有区别呢?

2.6 文件测试运算符

使用方法: file_name

operator

  • e 文件是否存在
  • r 文件可读检测
  • w 文件可写检测
  • x 文件可执行检测
  • d 目录检测
  • f 普通文件检测(既不是目录,也不是设备文件)
  • b 块设备检测
  • c 字符设备检测
  • p 有名管道检测
  • s 文件大小是否为0
  • S 文件是否是socket连接
  • L 文件是否存在并且是一个符号链接
  • g 文件SGID位检测
  • u 文件SUID位检测
  • k 文件粘滞位(Sticky Bit)检测

三、参考文章

【1】Shell 教程