基本够用的 Shell Script 语法
选择 Shell
在 Shell 脚本的第一行设置,如下选择 bash 来运行
#!/bin/bash
Linux 中的 Shell 有多种,常见有以下:
- Bourne Shell(sh),是 UNIX 最初使用的 Shell,在不同 UNIX 下均能使用。
- sh 在 Shell 编程上非常好用,但在与用户的交互上不如其他。
- Bourne Again Shell(bash),是 Linux 系统默认的shell,基于 sh 扩展而来,与 sh 兼容。
- 相对于 sh,bash 增加了许多特性,如命令行补全、命令行编辑、命令历史表等
- C Shell(csh)是一种比 sh 更适合于编程的 Shell,语法和 C 语言很相似。
- Tcsh 是 Linux 为喜欢使用 csh 的人提供的,是 csh 的一个扩展版本。
- Korn Shell(ksh) 集合了 csh 和 sh 的优点,并且与 sh 完全兼容。
- pdksh 是 Linux 提供的基于 ksh 扩展的一种 Shell,支持了任务控制,可以挂起、后台执行、唤醒、终止。
- Almquist shell(ash)是一个轻量级的 Unix Shell,诞生于 1980s,最初是 bash 的一个克隆版本,后来在 1990s 时 ash 取代 bash 成为 BSD 系的 Unix 的默认 Shell
- Z Shell(zsh)有着很多灵活的特性,更适合与人交互,在 2019 年苹果 WWDC 发布会上,zsh 已经取代 bash 成为 Mac 的默认 Shell
- 著名的 Github 项目
oh-my-zsh
已经基本成为若干程序员的标配了
- 著名的 Github 项目
以下语法均以bash
为主要背景,大多数 Shell 如 zsh 基本上都与bash
兼容
变量
VAR_NAME=“var value”
$ cat test.sh
VAR="asd"
echo ${VAR}
$ ./test.sh
asd
数组
bash 仅支持一维数组,元素以空格为区分。若一个元素包含空格,则应使用单引号或双引号将这个元素围起来。
$ cat test.sh
array=(qwe asd "zx c")
echo ${array[0]}
echo ${array[1]}
echo ${array[2]}
array[0]=QWE
echo ${array[0]}
$ ./test.sh
qwe
asd
zx c
QWE
常用的针对数组的操作:
${array[*]}
获取数组的所有元素${#array[*]}
或${#array[@]}
获取数组元素个数array[i]=value
设置第i
个元素的值
脚本的参数
通过$0
来获取第 0 个参数,$1
来获取第 1 个参数,以此类推
$#
代表参数个数$*
代表所有参数,用一整个字符串表示$@
代表所有参数,用每个参数表示$$
代表运行脚本的当前进程 ID 号$?
代表最后命令的退出状态,0表示没有错误,非0表示有错误$!
代表后台运行的最后一个进程的 ID 号
$ cat test.sh
echo $1
echo $2
echo $#
$ ./test.sh arg1 arg2
arg1
arg2
2
$*
和$@
均代表所有参数,区别在于前者将所有参数组合成一个字符串,后者仍是分离的每个参数。
$ cat test.sh
echo $#
echo "------"
for arg in "$*"
do
echo ${arg}
done
echo "------"
for arg in "$@"
do
echo ${arg}
done
$ ./test.sh arg1 arg2
2
------
arg1 arg2
------
arg1
arg2
对于参数arg1 arg2
:
$*
的背后含义是"arg1 arg2"
$@
的背后含义是"arg1" "arg2"
但是!如果不用双引号将$*
和$@
围起来的话,二者仅有的这点区别似乎就没了
$ cat test.sh
echo $#
echo "------"
for arg in $*
do
echo ${arg}
done
echo "------"
for arg in $@
do
echo ${arg}
done
$ ./test.sh arg1 arg2
2
------
arg1
arg2
------
arg1
arg2
基本数学运算
expr
命令支持加、减、乘、除、取余,均针对有符号整数运算。
- 乘法需要用
\
进行转义,即\*
表示乘法- 仅
*
代表当前工作目录下的所有文件,可用$(pwd)
来获取当前工作目录
- 仅
$ cat test.sh
a=52
b=10
echo $a + $b = `expr $a + $b`
echo $a - $b = `expr $a - $b`
echo $a \* $b = `expr $a \* $b`
echo $a / $b = `expr $a / $b`
echo $a % $b = `expr $a % $b`
$ ./test.sh
52 + 10 = 62
52 - 10 = 42
52 * 10 = 520
52 / 10 = 5
52 % 10 = 2
也可以使用((
和))
来完成运算,基本使用方式是$(( expressiong ))
$ cat test.sh
a=52
b=10
echo $a + $b = $(($a + $b))
echo $a - $b = $(($a - $b))
echo $a \* $b = $(($a * $b))
echo $a / $b = $(($a / $b))
echo $a % $b = $(($a % $b))
$ ./test.sh
52 + 10 = 62
52 - 10 = 42
52 * 10 = 520
52 / 10 = 5
52 % 10 = 2
条件判断
条件运算位于[]
中,并有空格隔开。主要有三类:
- 数字
- 字符串
- 文件
数字条件判断
-eq
判断是否相等,相等则返回true
,等同于==
-ne
判断是否不等,不等则返回true
,等同于!=
-gt
判断是否大于,若左边大于右边则返回true
-lt
判断是否小于,若左边小于右边则返回true
-ge
判断是否大于等于,若是则返回true
-le
判断是否小于等于,若是则返回true
-a
进行逻辑与操作,若两个条件都满足则返回true
-o
进行逻辑或运算,若至少一个条件满足则返回true
$ cat test.sh
a=1
b=2
if [ $a -lt $b ]; then
echo "$a < $b"
else
if [ $a -eq $b ]; then
echo "$a = $b"
else
echo "$a > $b"
fi
fi
if [ $a -eq 1 -a $b -eq 2 ]; then
echo "a=1 & b=2"
else
echo "a!=1 or b!=2"
fi