2014-07-16
Shell脚本
Shell脚本是一个包含一系列命令序列的文本文件。当运行这个脚本文件时,文件中包含的
命令序列将得到执行。
语法
1, Shell脚本的第一行必须是如下格式:
#!/bin/sh
符号 #! 用来指定该脚本文件的解析程序。在上面的例子中使用 /bin/sh 来解析该脚本。
当编辑好脚本后,如果要执行该脚本,还必须使其具有可执行属性。
chmod +x filename
(也可以用 命令 : sh filename 执行)
2, 在进行 shell 编程时,以 # 开头的句子表示注释,直到这一行的结束。
3, 在 shell 编程中, 所有的变量都由字符串组成,并且不需要预先对变量进行声明。
例: #!/bin/sh
#set variable a
a="hello world"
#print a
echo "A is:"
echo $a
注意:变量赋值时, “=”左右两边都不能有空格。
BASH中的语句结尾不需要分号。
3.1 有时候变量名很容易与其他文字混淆。例:
num=2
echo "this is the $numnd"
执行结果是:输出 :this is the
原因:shell 会去搜索变量 numnd 的值,但是这个变量是没有值的。
可以用花括号来告诉shell我们要打印的是num变量
echo "this is the ${num}nd"
这将打印: this is the 2nd
3.2 默认变量
$# : 传入脚本的命令行参数个数
$* : 所有命令行参数值,在各个参数值之间留有空格
$0 : 命令本身 (shell文件名)
$1 : 第一个命令行参数
$2 : 第二个命令行参数
3.3 局部变量
在变量首次被赋值时加上 local 关键字可以声明一个局部变量。例:
#!/bin/bash
hello="var1"
echo $hello
function func1 {
local hello="var2"
echo $hello
}
func1
echo $hello
注意:func1 后面的花括号前要有个空格
输出:var1
var2
var1
4,if 语句
4.1 if[ expression ]
then
#code block
fi
4.2 if[ expression ]
then
#code block
else
#code block
fi
4.3 if [expression ]
then
#code block
else if[ expression ]
then
#code block
else
#code block
fi
fi
4.4 if [ expression ];then
#code block
elif [ expression ]
then
#code block
else
#code block
fi
fi
5, 比较
比较操作 整数操作 字符串操作
相同 -eq =
不同 -ne !=
大于 -gt >
小于 -lt <
大于或等于 -ge
小于或等于 -le
为空 -z
不为空 -n
例:
1,比较整数a和b是否相等: if [ $a = $b ] (也可用 eq )
2,判断整数a是否大于整数b: if [ $a -gt $b]
3,比较字符串a和b是否相等: if [ $a = $b ]
4,判断字符串 a 是否为空: if [ -z $a ]
注意:
1,在 "["和"]"符号的左右都留有空格
2. “=”左右都有空格
6,判断
-e 文件已经存在
-f 文件是普通文件
-s 文件大小不为零
-d 文件是一个目录
-r 文件对当前用户可以读取
-w 文件对当前用户可以写入
-x 文件对当前用户可以执行
例:
#!/bin/sh
folder=/home
[ -r "$folder" ] && echo "Can read $folder"
[ -f "$folder" ] || echo "this is not file"
7,For 循环
for循环结构与 C 语言中有所不同, 在 BASH 中 for 循环的基本结构是:
for var in [list]
do
#code block
done
其中 $var 是循环控制变量,[list]是var需要遍历的一个集合,do/done对
包含了循环体,相当于 C 语言中的一对大括号。另外如果 do 和 for 被写在同一行,
必须在 do 前面加上 ";" 。
如: for $var in [list];do
例1:
#!/bin/bash
for day in Sun Mon Tue Wed Thu Fri Sat
do
echo $day
done
例2: 如果列表被包含在一对双引号中,则被认为是一个元素:
#!/bin/bash
for day in "Sun Mon Tue Wed Thu Fri Sat"
do
echo $day
done
注意: 在for所在那行,变量 day 是没有加 "$"符号的,而在循环体内, echo 所在行变量
$day 是必须加上 “$”符号的。
8, while 循环
while 循环的基本结构是:
while [ condition ]
do
#code block
done
9, until 循环
until 循环的基本结构是:
until [ condition ]
do
#code block
done
while 和 until 的区别在于 while 是为真时执行, until是为假时执行。
10,Case语句
BASH 中的 case 结构与 C 语言中的 switch 语句的功能比较类似,可以用于进行
多项分支控制。
case "$var" in
condition1 )
;;
condition2 )
;;
* )
default statments;;
esac
例:
#!/bin/bash
echo "Hit a key, then hit return."
read Keypress
case "$Keypress" in
[A-Z]) echo "Uppercase letter";;
[a-z]) echo "Lowercase letter";;
[0-9]) echo "Digit";;
*)echo "Punctuation, whitespace, or other";;
esac
Shell脚本
Shell脚本是一个包含一系列命令序列的文本文件。当运行这个脚本文件时,文件中包含的
命令序列将得到执行。
语法
1, Shell脚本的第一行必须是如下格式:
#!/bin/sh
符号 #! 用来指定该脚本文件的解析程序。在上面的例子中使用 /bin/sh 来解析该脚本。
当编辑好脚本后,如果要执行该脚本,还必须使其具有可执行属性。
chmod +x filename
(也可以用 命令 : sh filename 执行)
2, 在进行 shell 编程时,以 # 开头的句子表示注释,直到这一行的结束。
3, 在 shell 编程中, 所有的变量都由字符串组成,并且不需要预先对变量进行声明。
例: #!/bin/sh
#set variable a
a="hello world"
#print a
echo "A is:"
echo $a
注意:变量赋值时, “=”左右两边都不能有空格。
BASH中的语句结尾不需要分号。
3.1 有时候变量名很容易与其他文字混淆。例:
num=2
echo "this is the $numnd"
执行结果是:输出 :this is the
原因:shell 会去搜索变量 numnd 的值,但是这个变量是没有值的。
可以用花括号来告诉shell我们要打印的是num变量
echo "this is the ${num}nd"
这将打印: this is the 2nd
3.2 默认变量
$# : 传入脚本的命令行参数个数
$* : 所有命令行参数值,在各个参数值之间留有空格
$0 : 命令本身 (shell文件名)
$1 : 第一个命令行参数
$2 : 第二个命令行参数
3.3 局部变量
在变量首次被赋值时加上 local 关键字可以声明一个局部变量。例:
#!/bin/bash
hello="var1"
echo $hello
function func1 {
local hello="var2"
echo $hello
}
func1
echo $hello
注意:func1 后面的花括号前要有个空格
输出:var1
var2
var1
4,if 语句
4.1 if[ expression ]
then
#code block
fi
4.2 if[ expression ]
then
#code block
else
#code block
fi
4.3 if [expression ]
then
#code block
else if[ expression ]
then
#code block
else
#code block
fi
fi
4.4 if [ expression ];then
#code block
elif [ expression ]
then
#code block
else
#code block
fi
fi
5, 比较
比较操作 整数操作 字符串操作
相同 -eq =
不同 -ne !=
大于 -gt >
小于 -lt <
大于或等于 -ge
小于或等于 -le
为空 -z
不为空 -n
例:
1,比较整数a和b是否相等: if [ $a = $b ] (也可用 eq )
2,判断整数a是否大于整数b: if [ $a -gt $b]
3,比较字符串a和b是否相等: if [ $a = $b ]
4,判断字符串 a 是否为空: if [ -z $a ]
注意:
1,在 "["和"]"符号的左右都留有空格
2. “=”左右都有空格
6,判断
-e 文件已经存在
-f 文件是普通文件
-s 文件大小不为零
-d 文件是一个目录
-r 文件对当前用户可以读取
-w 文件对当前用户可以写入
-x 文件对当前用户可以执行
例:
#!/bin/sh
folder=/home
[ -r "$folder" ] && echo "Can read $folder"
[ -f "$folder" ] || echo "this is not file"
7,For 循环
for循环结构与 C 语言中有所不同, 在 BASH 中 for 循环的基本结构是:
for var in [list]
do
#code block
done
其中 $var 是循环控制变量,[list]是var需要遍历的一个集合,do/done对
包含了循环体,相当于 C 语言中的一对大括号。另外如果 do 和 for 被写在同一行,
必须在 do 前面加上 ";" 。
如: for $var in [list];do
例1:
#!/bin/bash
for day in Sun Mon Tue Wed Thu Fri Sat
do
echo $day
done
例2: 如果列表被包含在一对双引号中,则被认为是一个元素:
#!/bin/bash
for day in "Sun Mon Tue Wed Thu Fri Sat"
do
echo $day
done
注意: 在for所在那行,变量 day 是没有加 "$"符号的,而在循环体内, echo 所在行变量
$day 是必须加上 “$”符号的。
8, while 循环
while 循环的基本结构是:
while [ condition ]
do
#code block
done
9, until 循环
until 循环的基本结构是:
until [ condition ]
do
#code block
done
while 和 until 的区别在于 while 是为真时执行, until是为假时执行。
10,Case语句
BASH 中的 case 结构与 C 语言中的 switch 语句的功能比较类似,可以用于进行
多项分支控制。
case "$var" in
condition1 )
;;
condition2 )
;;
* )
default statments;;
esac
例:
#!/bin/bash
echo "Hit a key, then hit return."
read Keypress
case "$Keypress" in
[A-Z]) echo "Uppercase letter";;
[a-z]) echo "Lowercase letter";;
[0-9]) echo "Digit";;
*)echo "Punctuation, whitespace, or other";;
esac