ShellScript笔记

前言

承接上一篇bash操作,趁热打铁学习一下shell script,很多语法容易忘,这里记录一些要点,权当初学笔记。

变量

定义

定义变量直接写,不能有空格,使用变量时用${}

1
2
3
4
5
6
7
8
variable0='hello world'
variable1="this is a test: ${variable0}" #双引号内会对变量进行解析
variable2=(this is another test)
echo ${variable0}
echo ${variable1}
echo ${variable2[0]} #数组,下标可不连续
echo ${variable2[@]} #取得所有元素
echo ${variable2[*]} #取得所有元素

只读变量

readonly variable0

删除变量

unset variable0 删除后不可再定义,只读变量无法删除

获取字符串长度

1
2
3
echo ${#variable0}
echo ${#variable2[@]} #获取数组长度
echo ${#variable2[*]} #同上

提取字符串:

1
2
3
4
5
6
7
8
9
variable1=abcdefgfedcba
echo ${variable1:0:2} #从下标为0开始取2位
echo ${variable1:3} # 从下标为3取到末尾
echo ${variable1#*c} #从左开始删,直到遇到第一个c并删除
echo ${variable1##*c} #从左开始删,直到后面没有c
echo ${variable1%f*} #从右开始删,直到遇到第一个f并删除时停止
echo ${variable1%%f*} #从右开始删,直到左侧没有f时停止
echo ${variable1:0-7:7} #倒数7位开始取,取7位
echo ${variable1:0-7} #倒数7位开始取,取到末尾

#删左边,%删右边

##、%%类比贪婪匹配,#、%类比懒惰匹配

通配符*不能少

传参

1
2
3
4
5
6
7
8
9
$0 #执行的文件名
$1 #第一个参数
$2 #第二个参数
#......以此类推
$# #参数个数
$* #一个字符串包含所有参数
$$ #当前PID
$! #后台运行最后一个进程的PID
$? #最后执行命令的退出状态。0表示无错误,其他表示出错。

运算

表达式和运算符间必须有空格

1
2
3
4
val=`expr 2 + 2` #`expr `不能少
echo ${val}
val=`expr 2 \* 2` #乘法运算要用\*
echo ${val}

条件表达式放方括号中,且必加空格

1
2
3
4
5
6
if [ 1 == 1 ] #变量和==间有空格,表达式和[]间也有空格
then
echo 'equal'
else
echo 'unequal'
fi

关系运算符

处理关系时可以通过全部使用两层[[]]避免逻辑错误

1
2
3
4
5
6
7
8
9
10
11
12
[ $a -eq $b ] #equal时返回true
[ $a -ne $b ] #not equal时返回true
[ $a -gt $b ] #greater than时返回true
[ $a -lt $b ] #less than时返回true
[ $a -ge $b ] #greater equal时返回true
[ $a -le $b ] #less equal时返回true
(( $a == $b )) #equal时返回true
(( $a != $b )) #not equal时返回true
(( $a > $b )) #greater than时返回true
(( $a < $b )) #less than时返回true
(( $a >= $b )) #greater equal时返回true
(( $a <= $b )) #less equal时返回true

布尔运算符

1
2
3
[ ! false ] #true 
[ $a lt 10 -o $a gt 20 ] #a小于10或大于20时返回true
[ $a lt 20 -a $a gt 10 ] #a大于10且小于20时返回true

逻辑运算符

1
2
3
[[ $a lt 10 || $a gt 20 ]] #a小于10或大于20时返回true
[[ $a lt 20 && $a gt 10 ]] #a大于10且小于20时返回true
#表达式必须在两层[[]]中,否则报错

字符串运算符

用关系运算符进行运算会得到预料之外的答案

1
2
3
4
5
[ $a = $b ] #相等返回true
[ $a != $b ] #不等返回true
[ -z $a ] #长为0返回true
[ -n $a ] #长不为0返回true
[ $a ] #不为空返回true

文件测试运算符

1
2
3
4
5
6
7
8
9
10
11
12
13
[ -b $file ] #设备文件返回true
[ -c $file ] #字符设备文件返回true
[ -d $file ] #目录返回true
[ -f $file ] #普通文件返回true
[ -g $file ] #文件设置了SGID位返回true
[ -k $file ] #文件设置了粘着位返回true
[ -p $file ] #有名管道返回true
[ -u $file ] #文件设置了SUID位返回true
[ -r $file ] #可读返回true
[ -w $file ] #可写返回true
[ -x $file ] #可执行返回true
[ -s $file ] #不为空返回true
[ -e $file ] #存在返回true

测试(test)

数值测试

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
test $[num1] -eq $[num2] #相当于
[[ $num1 -eq $num2 ]]
```
```Bash
a=1
b=2
echo $[a+b] #进行算数运算,$[]中空格随意
echo $[ a+b ]
echo $[ a + b ]
echo $[ $a + $b ] #变量前$可加可不加,但[]前比加$
```
#### 字符串测试
```Bash
test $str1 == $str2
test $str1 = $str2 #相当于
[[ $str1 == $str2 ]]
#和 [[ $str1 -eq $str2 ]] 结果不同

test $str1 != $str2
test -z $str1
test -n $str1

文件测试

类比数值测试和字符串测试

流程控制

条件语句

若无else语句则不能写else(流程控制不可为空)

1
2
3
4
5
6
7
8
if condition1
then
command1
command2
...
else
commandn
fi

1
2
3
4
5
6
7
8
9
if condition1
then
command1
elif condition2
then
command2
else
command3
fi
1
2
#单行书写时注意分号;
if [[ condition1 ]]; then command1; fi

for循环

1
2
3
4
5
6
7
for var in item1 item2 item3
do
command1
command2
...
commandn
done
1
2
#单行书写注意分号;
for var in item1 item2 ... itemN; do command1; command2… done;

while语句

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
while condition
do
command1
command2
done

while read FILM #循环读取输入,Ctrl+D退出
do
echo "film name is $FILM"
done

while : #无限循环,相当于while true
do
command1
done

until循环

1
2
3
4
5
until condition
do
command1
command2
done

case语句

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
casein 
取值1)
command1
;; #执行到;;
取值2)
command2
;;
*) #捕获所有状态
commandn
;;
esac #case反过来,LOL

#例子
read aNum
case $aNum in
1) echo 1
;;
2) echo 2
;;
3) echo 3
;;
4) echo 4
;;
*) echo '你没有输入 1 到 4 之间的数字'
;;
esac

break

跳出循环

continue

进入条件判断(while)或自增(for)

函数

定义

1
2
3
4
5
function 函数名() #function可写可不写
{
#可以通过$1 $2等取得参数
return ; #若不设定则顺序执行到最后一行,返回执行结果
}

引用外部文件

用点号.加文件名引用. 文件名.sh

或用source 文件名.sh

注意:被包含的文件不需要执行权限

TODO

过了一遍语法,仍有一些不清楚的地方需要在实践中学习。shell script和笔者先前接触的语言相比,既有相似的地方,又有很多不同的特性,需要逐渐熟悉。

×

纯属好玩

扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

文章目录
  1. 1. 前言
    1. 1.1. 变量
      1. 1.1.1. 定义
      2. 1.1.2. 只读变量
      3. 1.1.3. 删除变量
      4. 1.1.4. 获取字符串长度
      5. 1.1.5. 提取字符串:
    2. 1.2. 传参
    3. 1.3. 运算
      1. 1.3.1. 关系运算符
      2. 1.3.2. 布尔运算符
      3. 1.3.3. 逻辑运算符
      4. 1.3.4. 字符串运算符
      5. 1.3.5. 文件测试运算符
    4. 1.4. 测试(test)
      1. 1.4.1. 数值测试
      2. 1.4.2. 文件测试
    5. 1.5. 流程控制
      1. 1.5.1. 条件语句
      2. 1.5.2. for循环
      3. 1.5.3. while语句
      4. 1.5.4. until循环
      5. 1.5.5. case语句
      6. 1.5.6. break
      7. 1.5.7. continue
    6. 1.6. 函数
      1. 1.6.1. 定义
    7. 1.7. 引用外部文件
  2. 2. TODO
,