Shell语言基础

Posted by 王子段 | WangZiduan on July 28, 2020

Shell语言入门笔记

shell编程环境也有许多,如Bourne Shell、Bourne Again Shell、C Shell、K Shell等,一般常用的是Bourne Again Shell(即bash),这也是linux系统默认的shell。

常用

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
#!/bin/bash          #指定shell解释器

#echo
echo '输出一些文字' 
echo -e "OK!\n"   #-e 开启转义
echo "hello world!" > myfile  #结果重定向至文件
echo `date`  #显示时间

#变量
var1='定义一个变量,等号周围没有空格'
readonly var1  #只读变量
unset var1     #删除变量

#字符串
echo '${var1},使用一个变量'   #!!单引号中的所有字符都会被原样输出,引用变量无效
echo `expr index "$string" io`  #查找字符i或o的位置(看哪个先出现)
echo ${#string}  #获取字符串长度
-z #检测字符串长度是否为0
-n #检测字符串长度是否不为0
$  #检测字符串是否为空

#定义数组
array_n=(v0 v1 v2)
array_n[n]=vn  #可以不使用连续的下标,而且下标的范围没有限制
${array_n[@]}  #读取数组中的所有元素

#Shell 里面的中括号(包括单中括号与双中括号)可用于一些条件的测试
[ $var -eq 0 ] #变量是否为0
[ -e $var ]    #文件是否存在
[ -d $var ]    #是否是目录
[[ $var1 = $var2 ]] #字符串比较

-s file  #检测文件是否存在,不为空返回true
-e file  #检测文件(或目录)是否存在,如果是,返回true

#printf(不会自动换行),但更适合格式输出
read var  #从键盘读入输入

readlink -f #一直跟随符号链接,直到直到非符号链接的文件位置

控制逻辑

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
#if条件
if condition
then
		command1
elif condition2
then
		command2
else
		command3
fi


#for循环
for var in i1 i2 i3
do 
		command1
		command2
done


#while循环
while condition
do
		command
done
	
	
#until循环:和while循环相反,直到条件为true时停止(用得少)
until condition
do 
		command
done


#case
case array in 
	1) command
	;;
	2) command
	;;
	*) command
	;;
esac

运算符

原生bash不支持数学运算,但可以用awk和expr来进行求值操作。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#数学运算
val=`expr 2 + 2` #!!!表达式和运算法之间一定要有空格

#关系运算
-eq   #equal
-ne   #not equal
-gt   #great than
-lt   #lower than
-ge   #great equal
-le   #lower equal

#布尔运算
!    #非
-o   #或,有一个为true即为true (or)
-a   #与,两个都为true才为true (and)

#逻辑运算
&&  #逻辑的and [[ $a -lt 100 && $b -gt 100 ]] 返回 false
||  #逻辑的or  [[ $a -lt 100 || $b -gt 100 ]] 返回 true

脚本参数

1
2
3
4
5
6
7
$#  #传递到脚本的参数个数
$*  #显示所有向脚本传递的参数
$$  #脚本当前运行的进程ID号
$!  #后台运行的最后一个进程的ID号
$@  #用引号分割,显示所有脚本参数
$-  #显示shell使用的当前选项
$?  #显示最后命令的退出状态。0表示没有错误。
1
2
3
4
5
6
7
8
#注释相关
:<<'
这是一段多行注释'

:<<!
这也可以是一段多行注释!

#如果在开发过程中,遇到大段的代码需要临时注释起来,过一会儿又取消注释,怎么办呢?每一行加个'#'符号太费力了,可以把这一段要注释的代码用一对花括号括起来,定义成一个函数,没有地方调用这个函数,这块代码就不会执行,达到了和注释一样的效果。

set 命令

set命令主要用来设置shell,在编写shell脚本时,使用set命令能设置shell的执行方式,根据需求不同,采用的参数设置也不同。set命令也用来显示系统中已存在的shell变量以及设置新的shell变量。

1
2
3
4
5
6
7
set     #显示环境变量
set -e  #只要脚本中发生错误,就停止执行并退出shell(否则虽然报错,但是依旧会继续运行
set -u  #如果遇到不存在的变量会报错并停止执行(否则不报错,也继续执行)
set -x  #先输出执行的那一行命令
set -e  #脚本只要发生错误,就终止执行

## tips:set后的后缀改成+号则会关闭该功能。