在Linux系统中的变量,一般有两种:“环境变量”、“局部变量”。还有一种变量被称为“特殊变量”,该类变量以只读的形式存在。
shell脚本中的变量
全局变量
在脚本中定义的变量都是全局变量。包括脚本中的函数,函数中使用的变量依然在全局生效。声明变量时,使用“declare”,可以通过选项在声明的时候给予某些属性。
选项:
-p:
-a:数组索引
-A:数组变量
-f:仅仅代表函数名
-i:整型数
-l:小写字母(自动转)
-r:只读变量声明
-t:跟踪属性,调试用
-u:大些字母
-x:通过环境变量导出的变量声明
定义一个数组、赋值、输出数组:
declare -a arr arr=(3 7 2 6 11) echo ${arr[@]}
检查执行结果
[root@right mag]# . shuzu.sh 3 7 2 6 11
局部变量
通过“local”关键字在函数内部定义局部变量。可以接受“declare”的一切选项。最好在函数中定义局部变量时使用。当在函数中使用local时,它会导致变量名使可见范围仅限于该函数及其子函数。
play_() { local i=3310 return i }
清除变量
$ a=3 $ unset a
位置变量
脚本参数 、函数参数
$1 ${10}
输出第一个参数、第十个参数:
[root@right mag]# ./position_parameter.sh 1 2 3 4 5 6 7 8 9 1 [root@right mag]# ./position_parameter.sh 1 2 3 4 5 6 7 8 9 10 1 10
特殊变量
$? $# $$ $* $@ $_
查看当前bash的进程号,以及命令执行的返回值。
[root@right mag]# echo $$ 12365 [root@right mag]# ps -C bash PID TTY TIME CMD 12365 pts/0 00:00:00 bash [root@right mag]# echo $? 0
引用上条命令的最后一个参数
[view@front ~]$ ls /data01/work/portal/logs/ catalina.out [view@front ~]$ cd $_ [view@front logs]$
bash脚本调试
检查脚本语法、调试执行脚本
$ bash -n adduser.sh $ bash -x adduser.sh
shell脚本追踪
在测试脚本时,可以使用set命令进行运行时的追踪。在脚本中加入一行“set -x”;以“+”开头的行,就是获得的追踪内容(程序的执行过程)。
[root@right mag]# cat tes.sh #!/bin/bash set -x read -p "How old are you? " answer if [ $answer == "34" ]; then echo "Yes, very good." else echo "No, i don't want say anyting." fi exit 0 [root@right mag]# ./tes.sh + read -p 'How old are you? ' answer How old are you? 34 + '[' 34 == 34 ']' + echo 'Yes, very good.' Yes, very good. + exit 0 [root@right mag]# ./tes.sh + read -p 'How old are you? ' answer How old are you? 33 + '[' 33 == 34 ']' + echo 'No, i don'\''t want say anyting.' No, i don't want say anyting. + exit 0
看看没有追踪的执行过程:
[root@right mag]# ./tes.sh How old are you? 32 No, i don't want say anyting.