Linux 中不以后缀名区分文件类型。

创建 shell 需手动更改文件可执行权限。

首行指明解释脚本的 shell,如:#!/bin/bash

cat /etc/shells 查看所有可用终端。

echo $SHELL 查看当前终端。

shell 中变量赋值,= 两边不要有空格。

readonly myUrl 让 myUrl 变成只读变量。

unset xxx 删除变量,但不能删除只读变量。

read -p " xxx " num 读取输入,并赋值给 num,提示字符串。

shell 中,变量都是字符串。

"xxx" xxx 中的变量会进行替换
'xxx' 单引号之间的内容都会原样输出。
`xxx` 把 xxx 当作 shell 命令来执行。
1
2
3

read 读取用户输入。

$num 脚本输入参数,0 表示 shell 文件名

$# 表示输入参数的个数,不包括 $0

$@ 表示所有的参数,与 $* 相同,但是使用时加引号,并在引号中返回每个参数。

$* 表示所有的参数。

$? 前一条指令运行的结果,运行正常结果是 0,其他为运行不正常。

$$ 当前 shell 进程的 pid。

$PATH 环境变量,即/etc/environment 内的内容。

终端中 export xxx,即可在 shell 中 $xxx 引用。

-lt less than 小于

-gt greater than 大于

-le less equal 小于等于。

-eq equal 等于。

-ne not equal,不等于。

条件控制

if condition1
then
    command1
elif condition2
then
    command2
else
    commandN
fi
1
2
3
4
5
6
7
8
9
read NUM
if [ NUM -eq 2 ] then
    echo "NUM == 2"
else
    echo "NUM != 2"
fi
1
2
3
4
5
6
if [ -f $xxx ] # 判断 $xxx 是否是文件
if [ -d $XXX ] # 判断 $xxx 是否是目录
if [ -e $xxx ] # 检测 xxx 是否存在。
1
2
3

注意: if [ ][ ] 内的表达式要与 [ ] 两个字符之间有空格。

case 语句

casein
模式1)
    command1
    command2
    ...
    commandN
    ;;
模式2)
    command1
    command2
    ...
    commandN
    ;;
esac
1
2
3
4
5
6
7
8
9
10
11
12
13
14

如果无一匹配模式,使用星号 * 捕获该值,再执行后面的命令。

case $1 in
    张三)
    echo "这是张三"
    ;;
    李四)
    echo "这是李四"
    ;;
    *)
    ehco "不知道"
    ;;
esac
1
2
3
4
5
6
7
8
9
10
11

遍历

for var in item1 item2 ... itemN
do
    command1
    command2
    ...
    commandN
done
1
2
3
4
5
6
7
for person in $@ do
case $person in
    张三)
    echo "这是张三"
    ;;
    李四)
    echo "这是李四"
    ;;
    *)
    ehco "不知道"
    ;;
esac
done
1
2
3
4
5
6
7
8
9
10
11
12
13

循环

i=0
sum=0
while [ $i -le 100 ] do
    sum=`expr $sum + $i`
    i=`expr $i + 1`
    # 或者
    #let "sum=sum+i"
    #let "i=i+1"
    # 或者
    sum=$[ $sum + $i ]
    i=$[ $i + 1 ]

done
echo "sum = $sum"
1
2
3
4
5
6
7
8
9
10
11
12
13
14

在循环过程中,有时候需要在未达到循环结束条件时强制跳出循环,Shell 使用两个命令来实现该功能:break 和 continue。

函数

[ function ] funname [()]

{

    action;

    [return int;]

}
1
2
3
4
5
6
7
8
9

参数返回,可以显示加:return 返回,

如果不加,将以最后一条命令运行结果,作为返回值。 return后跟数值n(0-255)

function test_shell()
{
    echo "This is test_shell..."
}
test_shell; # 调用 test_shell
1
2
3
4
5

在Shell中,调用函数时可以向其传递参数。在函数体内部,通过 $n 的形式来获取参数的值,

例如,$1表示第一个参数,$2表示第二个参数...

#!/bin/bash
# author:菜鸟教程
# url:www.runoob.com

funWithParam(){
    echo "第一个参数为 $1 !"
    echo "第二个参数为 $2 !"
    echo "第十个参数为 $10 !" # 写法错误。
    echo "第十个参数为 ${10} !"
    echo "第十一个参数为 ${11} !"
    echo "参数总数有 $# 个!"
    echo "作为一个字符串输出所有参数 $* !"
}
funWithParam 1 2 3 4 5 6 7 8 9 34 73
1
2
3
4
5
6
7
8
9
10
11
12
13
14

调试

set -x

...

set +x
1
2
3
4
5

用于脚本调试。set是把它下面的命令打印到屏幕。

set -x 是开启,set +x 是关闭。

数组

bash支持一维数组(不支持多维数组),并且没有限定数组的大小。

类似于 C 语言,数组元素的下标由 0 开始编号。获取数组中的元素要利用下标,下标可以是整数或算术表达式,其值应大于或等于 0。

array_name=(value0 value1 value2 value3)
array_name=(
value0
value1
value2
value3
)
valuen=${array_name[n]} # 读取数组元素值
echo ${array_name[@]} # 使用 @ 符号可以获取数组中的所有元素
1
2
3
4
5
6
7
8
9

布尔运算符

! 非运算。

-o or 或运算。

-a and 与运算。

#!/bin/bash
# author:菜鸟教程
# url:www.runoob.com

a=10
b=20

if [ $a != $b ]
then
   echo "$a != $b : a 不等于 b"
else
   echo "$a == $b: a 等于 b"
fi
if [ $a -lt 100 -a $b -gt 15 ]
then
   echo "$a 小于 100 且 $b 大于 15 : 返回 true"
else
   echo "$a 小于 100 且 $b 大于 15 : 返回 false"
fi
if [ $a -lt 100 -o $b -gt 100 ]
then
   echo "$a 小于 100 或 $b 大于 100 : 返回 true"
else
   echo "$a 小于 100 或 $b 大于 100 : 返回 false"
fi
if [ $a -lt 5 -o $b -gt 100 ]
then
   echo "$a 小于 5 或 $b 大于 100 : 返回 true"
else
   echo "$a 小于 5 或 $b 大于 100 : 返回 false"
fi
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

shell 简易教程 (opens new window)

最后更新: 2023/7/14 15:06:50