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 命令来执行。
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
2
3
4
5
6
7
8
9
read NUM
if [ NUM -eq 2 ] then
echo "NUM == 2"
else
echo "NUM != 2"
fi
2
3
4
5
6
if [ -f $xxx ] # 判断 $xxx 是否是文件
if [ -d $XXX ] # 判断 $xxx 是否是目录
if [ -e $xxx ] # 检测 xxx 是否存在。
2
3
注意: if [ ]
中 [ ]
内的表达式要与 [ ]
两个字符之间有空格。
case 语句
case 值 in
模式1)
command1
command2
...
commandN
;;
模式2)
command1
command2
...
commandN
;;
esac
2
3
4
5
6
7
8
9
10
11
12
13
14
如果无一匹配模式,使用星号 * 捕获该值,再执行后面的命令。
case $1 in
张三)
echo "这是张三"
;;
李四)
echo "这是李四"
;;
*)
ehco "不知道"
;;
esac
2
3
4
5
6
7
8
9
10
11
遍历
for var in item1 item2 ... itemN
do
command1
command2
...
commandN
done
2
3
4
5
6
7
for person in $@ do
case $person in
张三)
echo "这是张三"
;;
李四)
echo "这是李四"
;;
*)
ehco "不知道"
;;
esac
done
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"
2
3
4
5
6
7
8
9
10
11
12
13
14
在循环过程中,有时候需要在未达到循环结束条件时强制跳出循环,Shell 使用两个命令来实现该功能:break 和 continue。
函数
[ function ] funname [()]
{
action;
[return int;]
}
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
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
2
3
4
5
6
7
8
9
10
11
12
13
14
调试
set -x
...
set +x
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[@]} # 使用 @ 符号可以获取数组中的所有元素
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
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