1)shell脚本第一行必须是如下格式:
#!/bin/sh
符号#!用来指定该脚本文件的解析程序。上面就是使用/bin/sh来解析该脚本,
编辑好后,要执行该脚本,还必须有可执行属性:
chmod +x filename
注:可在终端输入 cat /etc/passwd 指令查看linux为各用户预设的shell解析器。
如: root:x:0:0:root:/root:/bin/bash
wm:x:1000:1000:wm,,,:/home/wm:/bin/bash
表示为root用户和wm用户预设的bash解析。
2)#开头表示注释,直到该行结束
3)变量没有类型,所有变量都由字符串组成,调用时前面加$,如:
#!/bin/sh
#set variable a
a="hello word"
# print a
echo "A is:"
echo $a
4)有时候变量名容易与其他文字混淆,如:
num=2
echo "this is the $numnd"
结果将只会输出: this is the ,因为shell会去搜索变量numnd的值,这个变
量是没有定义值得。可使用花括号解决上述问题:
num=2
echo "this is the ${num}nd"
结果会输出: this is the 2nd
5)默认变量:
$# :传入脚本的命令行参数个数
$* :所有命令行参数值,在各个参数之间留有空格
$0 :命令本身(shell文件名)
$1 :第一个命令行参数
$2 :第二个命令行参数
如:脚本文件名为 example,内容如下:
#!/bin/sh
echo "number of vars:"$#
echo "values of vars:"$*
echo "value of cmd:"$0
echo "value of var1:"$1
echo "value of var2:"$2
echo "value of var3:"$3
运行 ./example 1 2 3 (表示执行example脚本并传入1,2,3三个参数)
输出: number of vars:3
values of vars:1 2 3
value of cmd:./example 1 2 3
value of var1:1
value of var2:2
value of var3:3
运行 sh example 1 2 3
输出: number of vars:3
values of vars:1 2 3
value of cmd:example 1 2 3
value of var1:1
value of var2:2
value of var3:3
注意:两种运行方式中$0的区别。
6)变量首次被赋值是加上local关键字可以声明一个局部变量。如:
#!/bin/sh
hello="var1"
echo $hello
function func1 {
local hello="var2"
echo $hello
}
func1
echo $hello
注意:“function func1 {”中func1和“{”之间必须要加个空格,否则会报
错。
输出: var1
var2
var1
7)变量注意事项:
变量赋值是,“=”左右不能有空格;
BASH中的语句结尾不需要分号。
8)if语句格式:
第一种: if [ expression ]
then
#code block
fi
第二种: if [ expression ]
then
#code block
else
#code block
fi
第三种: if [ expression ]
then
#code block
else if [ expression ]
then
#code block
else
#code block
fi
fi
注意:“[”和“]”左右两边必须要留有有空格或回车。
9)if常用的比较操作符:
比较操作 整数操作 字符串操作
相同 -eq =
不同 -ne !=
大于 -gt >
小于 -lt <
大于等于 -ge
小于等于 -le
为空 -z
不为空 -n
例:
比较整数a和b是否相等: if [ $a = $b ] #也可用-eq
判断整数a是否大于整数b: if [ $a -gt $b ]
比较字符串a和字符串b是否相等: if [ $a = $b ]
判断字符串a是否为空: if [ -z $a ]
注意:操作符(包括“=”,这里不是赋值符)左右都有空格。
10)文件判断符:
-e 文件已经存在
-f 文件是普通文件
-s 文件大小不为零
-d 文件是一个目录
-r 文件对当前用户可以读取
-w 文件对当前用户可以写入
-x 文件对当前用户可以执行
如: #!/bin/sh
folder=/home
[ -r "$folder" ] && echo "Can read $folder"
[ -f "$folder" ] || echo "this is not file"
注意:“&&”表示前面判断为真时才执行后面语句;“||”表示前面判断为
假时才执行后面的判断;变量内部不存在空格时,加不加双引号都一样,即
folder=/home和folder="/home"效果一样
11)for循环基本结构:
for var in [list]
do
#code block
done
其中&var(var是变量名)是循环控制变量,[list]是var需要遍历的一个集合,do/done对包含了循环体,
相当于C语言中的一对大括号。另外如果do和 for被写在同一行,必须在do前面加上“;”。如: for var in [list];do
(注意:“;”左右空格可有可无,不影响)。
例如: #!/bin/sh
for day in Sun Mon Tue Wed Thu Fri Sat
do
echo $day
done
输出: Sun
Mon
Tue
Wed
Tue
Fri
Sat
注意,如果列表被包含在一对双引号中,则表示一个元素,如:
#!/bin/sh
for day in "Sun Mon Tue Wed Thu Fri Sat"
do
echo $day
done
则输出: Sun Mon Tue Wed Thu Fri Sat
注意:for循环所在行变量day是不加“$”的(相当于给变量赋值阶段),而
在循环体内,变量$day是必须加上“$”符号的(相当于调用阶段)。
12)while循环基本结构:
while [ condition ]
do
#code block
done
until循环基本结构:
until [ condition ]
do
#code block
done
注意:while和until的区别在于while是为真时执行,until是为假是执行。
13)case语句格式:
case "$var" in
condition1)
;;
condition2)
;;
*)
default statments;;
esac
例: #!/bin/sh
echo "Press your keyboard, then the data return."
read Keypress
case "$Keypress" in
[A-Z]) echo "Uppercase letter";;
[a-z]) echo "Lowercase letter";;
[0-9]) echo "Digit";;
*) echo "Puncturation, whitespace, or other";;
esac
注意:read是shell脚本语言提供的一个函数,其功能是“等待,直到你在
盘输入一个字符,然后赋值给后面的变量”。
-------------------------------------------------------------------------------------------------------------------
变量内容有空格时必须要加双引号(" ")或单引号(' '),但这两者是有区别的:
双引号内的特殊字符如$等,可以保持原有特性,如:
var="lang is $LANG" 则 echo $var 可得 lang is en_US
单引号内的特殊字符仅为一般字符,如:
var='lang is $LANG' 则 echo $var 可得 lang is $LANG