#! /bin/bash
# shell编程基础
# Shell脚本的基本构成
通常在第1行以“#!”开头指定Shell脚本的运行环境,即声明该脚本使用哪个Shell程序运行。如果没有指定,则以当前正在执行的Shell来解释执行。
以“#”开头的行是注释行
# 字符串左右的反引号(`)用于命令转换(转换)
# 包含外部脚本
包含外部脚本文件的用法如下:
. 脚本文件名,
./脚本文件名
或
source 脚本文件名
bash 脚本文件名
两种方式的作用一样,为简单起见,一般使用点号,但要注意点号和脚本文件名之间一定要有一个空格。
# 调试Shell脚本
在bash中Shell脚本的调试主要是利用bash命令解释程序的选项来实现。其格式为:
bash [选项] 脚本名
-v 选项允许用户查看Shell程序的读入和执行,会打印出命令行的原始内容。
-x 选项允许用户查看Shell程序的执行,会打印出经过替换后的命令行的内容。
# 用户自定义变量
变量无需事先声明,给变量赋值也就是定义一个变量的过程:
变量名=变量值
等号两边不能留空格
引用时需要$符号,如果紧跟在变量名称后面的字符是字母、数字或下划线,变量名称必须要用{}括起来
删除变量
使用 unset 命令可以删除变量。
添加环境变量
使用export命令将变量添加到环境中,作为临时的环境变量(一种全局变量)。
# 内部变量
$0 当前脚本的文件名
$n 传递给脚本或函数的参数。n是一个数字,表示第几个参数。例如,第一个参数是$1,以此类推
$# 传递给脚本或函数的参数个数
$* 传递给脚本或函数的所有参数
$@ 传递给脚本或函数的所有参数。被双引号(" ")包含时,与 $* 稍有不同
$? 上个命令的退出状态,或函数的返回值
$$ 当前Shell进程ID。对于 Shell 脚本,就是这些脚本所在的进程ID
# 数组
bash支持一维数组,不支持多维数组。
在Shell中用括号来表示数组,数组元素用空格符号分割开:
数组名=(值1 ... 值n)
也可以单独定义数组的各个元素。可以不使用连续的下标,而且下标的范围没有限制。
读取数组元素值的语法格式为:
${数组名[下标]}
采用以下用法获取数组元素的个数:
${#数组名[@]}
以下方法用于取得数组单个元素的长度:
${#数组名[n]}
# 算术表达式
bash自身并不支持简单的数学运算,但是可以通过awk 和expr等命令来实现数学运算。
expr最为常用,使用它能够完成表达式的求值操作。
例如:
expr 5 + 3
注意操作数(用于计算的数)与运算符之间一定要有空格。
更为简单的方式是使用$[]表达式进行数学计算,
例如:
val=$[5+3]
这种形式不要求运算符与操作数之间有空格
# 算术运算符
+:加法
-:减法
*:乘法
/:除法
%:取余
=:赋值
# 逻辑表达式
通常使用test命令来判断表达式的真假。
语法格式如下:
test 逻辑表达式
该命令有一个更常用的别名,即左方括号“[”。语法格式如下:
[ 逻辑表达式 ]
中括号两边都要有空格
# 整数关系运算符
-eq:相等。检测两个数是否相等,相等返回 true。
-ne:不等于。检测两个数是否相等,不相等返回 true。
-gt:大于。检测左边的数是否大于右边的,如果是,则返回 true。
-lt:小于。检测左边的数是否小于右边的,如果是,则返回 true。
-ge:大于等于。
-le:小于等于。
# 字符串检测运算符
=:检测两个字符串是否相等,相等返回 true。
!=:检测两个字符串是否相等,不相等返回 true。
-z:检测字符串长度是否为0,为0返回 true。
-n:检测字符串长度是否为0,不为0返回 true。
str:检测字符串是否为空,不为空返回 true。这里不用使用运算符,直接测试字符串,
如 [ $a ] 返回 true。
# 文件测试运算符
-b:检测文件是不是块设备文件,如果是,则返回 true。
-c:检测文件是不是字符设备文件,如果是,则返回 true。
-d:检测文件是不是目录,如果是,则返回 true。
-f:检测文件是不是普通文件(既非目录,又非设备文件),如果是,则返回 true。
-g:检测文件是否设置了SGID 位,如果是,则返回 true。
-k:检测文件是否设置了粘着位(Sticky Bit),如果是,则返回 true。
-p:检测文件是不是具名管道,如果是,则返回 true。
-u:检测文件是否设置了SUID 位,如果是,则返回 true。
-r :检测文件是否可读,如果是,则返回 true。
-w:检测文件是否可写,如果是,则返回 true。
-x:检测文件是否可执行,如果是,则返回 true。
-s :检测文件是否为空(文件大小是否大于0),不为空返回 true。
-e:检测文件(包括目录)是否存在,如果是,则返回 true。
-a:与运算。两个表达式都为 true才返回 true。
-o:或运算。有一个表达式为true就返回 true。
!:非运算。表达式值为 true 则返回 false,否则返回 true。
# 流程控制语句
# if语句
if [ 条件表达式 ]
then
语句序列1
else
语句序列2
fi
# case语句
case 值 in
模式1)
语句序列1
;;
模式2)
语句序列2
;;
……
模式n)
语句序列n
;;
*)
其他语句序列
esac
#例程
#!/bin/bash
function printit()
{
echo -n "your choice is $1"
}
function help()
{
cat << HELP
echo "this is help manual"
HELP
}
echo "this proogram will print your selection !"
case $1 in
-h) help;;
"one") printit;echo $1 |tr 'a-z' 'A-Z';;
"two") printit;echo $1 |tr 'a-z' 'A-Z';;
"three") printit;echo $1 |tr 'a-z' 'A-Z';;
*) echo "usage $0 {one|two|three}";;
esac
# 循环语句while
while 测试条件
do
语句序列
done
#例程:
#! /bin/bash
number=0
while [ $number -lt 10 ]
do
echo $number
number=`expr $number + 1`
done
# 循环语句until
until 测试条件
do
语句序列
done
例程:
#! /bin/bash
var=10
until [ $var -lt 1 ]
do
echo $var
var=$(($var-1))
done
# 循环语句for
for 变量 [in 列表]
do
语句序列
done
例程:
#! /bin/bash
var=0
for var in 1 2 3 4 5 ###
do
echo "$var"
done ###
# 其他循环语句
break 语句用来终止一个重复执行的循环。这种循环可以是for、until或者while语句构成的循环。
break [n]
continue 语句跳过循环体中位于它后面的语句,回到本层循环的开头,进行下一次循环。
continue [n]
exit 语句用来退出一个Shell程序,并设置退出值。
exit [n]
# 函数的定义和调用
# 函数定义
Shell 函数必须先定义后使用。
[function] 函数名()
{
命令序列
[return 返回值]
}
# 函数调用
调用函数只需要给出函数名,不需要加括号,就像一般命令那样使用。
函数名 参数1 参数2 …… 参数n