下面我们接着讲解shell脚本编程,主要内容如下:
◆ 向脚本传递参数
◆ shell中的嵌入式命令
◆ 调试shell脚本
◆ 在脚本中通过set传参
◆ 特定变量
一、向脚本传递参数
通常情况下,我们在向脚本传递参数的时,最多能传递9个参数,因为shell中只能使用$1-$9,如果我们要在脚本中使用第9个 以后的参数值,那怎么办呢?幸运的是,shell提供了shift命令,能很好的解决这个问题,下面我们先一个例子:
#example_1:No_1.sh
#!/bin/bash
while [ $# -ne 0 ]
do
echo $1
done
./No_1.sh a b c
a
a
a
...
上面这个例子,由于无法将参数偏移到下一个参数,故执行结果为:不断的输出a
我们加入shift命令,看一下下面这个例子:
#example_2:No_2.sh
#!/bin/bash
while [ $# -ne 0 ]
do
echo $1
shift
done
./No_2.sh a b c
a
b
c
执行结果为a b c 符合我们的预期
我们看一下shift的其他用法, 获取命令行中的最后一个参数
◆方式一: eval echo \$$#
◆方式二: shift 'expr $# -2'
二、shell中的嵌入式命令
: 空,永远返回为true
. 从当前shell中执行操作
break 退出for、whiel、until或case语句
cd 改变到当前目录
continue 执行循环的下一步
echo 反馈信息到标准输出
eval 读取参数,执行结果命令
exec 执行命令,但不在当前shell
exit 退出当前shell
export 导出变量,使当前shell可利用它
pwd 显示当前目录
read 从标准输入读取一行文本
readonly 使变量只读
return 退出函数并带有返回值
set 控制各种参数到标准输出的显示
shift 命令行参数向左偏移一个
test 测试条件表达式
times 显示shell运行过程的用户和系统时间
trap 当捕获信号时运行指定命令
ulimit 显示或设置shell资源
umask 显示或设置缺省文件创建模式
unset 从shell内存中删除变量或函数
wait 等待直到子进程运行完毕,报告终止
type 查询命令是否任驻留内存或命令类型;打印命令名是否有效或该命令在系统中的位置
eg:
tpye cd => cd is a shell builtin
tpye who => who is /usr/bin/who
三、调试shell脚本
1、循环、控制结构错误
此种错误,通常是由于漏写固定的关键字,如do后忘了写done,if后漏写fi等
可根据系统给出的提示,进行排错,如:
# ./a.sh
./a.sh: line 8: syntax error: unexpected end of file
2、漏写引号
此种错误,可根据系统提示排错,如:
# ./a.sh
./a.sh: line 6: unexpected EOF while looking for matching `"'
当shell打印出错误行后,通常在vi编辑器中查看文件,可使用vi的set nu选项调试错误,步骤如下:
a、进入vi,按ESC进入命令模式
b、输入冒号(:),然后键入set nu
此时系统将给vi中的文本给出行号,容易定位
3、test错误
此种错误是由于在[ 1 -eq 11 ] 忘写左边或右边的数字,或者时[]中忘记空格
# [ 1 -eq 1]
-bash: [: missing `]'
4、echo
在脚本重要部分插入echo语句,是一种比较有效的调试手段
5、set命令
set -n 读命令但不执行
set -v 显示读取的所有行
set -x 显示所有命令和参数
例子:
# vi b.sh #!/bin/bash #error #set set -x set -x LIST="shenzhen guangzhou dongguan zhuhai" echo -n "Enter address name:" read NAME for LOOP in $LIST do if [ "$LOOP" = "$NAME" ];then echo "the same to address name!" break fi done #unset set -x set +x
执行./a.sh ,输入不符合要求的值,输出结果如下:
+ LIST='shenzhen guangzhou dongguan zhuhai' + echo -n 'Enter address name:' Enter address name:++ read NAME chengdu + for LOOP in '$LIST' + '[' shenzhen = chengdu ']' + for LOOP in '$LIST' + '[' guangzhou = chengdu ']' + for LOOP in '$LIST' + '[' dongguan = chengdu ']' + for LOOP in '$LIST' + '[' zhuhai = chengdu ']' + set +x
四、在脚本中通过set传参
例子:
# vi c.sh #!/bin/bash set "a" "b" "c" while [ $# -ne 0 ] do echo $1 shift done #./c.sh a b c
五、特定变量
$?: 记录上次命令执行的结果,0:代表成功;非0:代表失败
$1 ~ $9 : 代表传递给脚本的参数名
$#:: 代表传递给脚本的参数个数