Shell变量
与其他语言不同,在Shell编程中,变量是非类型性质的,不必指定变量是数字还是字符串。
1、变量类型
Linux的Shell编程支持以下3种类型
(1)用户自定义变量。它是在编写Shell脚本时定义的,可以在Shell程序内任意使用和修改。可以将它看作局部变量,仅在当前的Shell实例中有效,其他Shell启动的程序不能访问这种变量。
(2)环境变量。作为系统的一部分,不必去定义他们,可以在Shell程序中使用他们,某些变量(如PATH)可以在Shell中加以修改。
(3)内部变量。这是Linux系统所提供的一种特殊类型的变量。此类变量在程序中用来做出判断。在Shell程序中,这类变量的值是不能修改的。常见的内部变量有$#(传送给Shell程序的位置参数的数量)、$?(最后命令完成码或者在Shell编程内部执行的Shell程序的返回值)、$0(Shell程序的名称)、$*(调用Shell程序时所传送的全部参数组成的单字符串)。
2、变量赋值和访问
Shell支持自定义变量。
1、变量定义
Shell编程中使用变量无需事先声明,给变量赋值的过程也就是定义一个变量的过程。变量的定义很简单,一般形式为
变量名=值
定义变量时,变量名不加"$"符号。在赋值符号的两边不允许有任何空格,如果值中含有空格,制表符或换行符,则要将这个字符串用引号括起来。在同一个变量中,可以一次存放整型值,下一次再存储字符串。
变量名的命名应当遵守如下规则:
1、首个字符必须为字母。
2、中间不能有空格,可以使用下划线(_)。
3、不能使用标点符号。
4、不能使用Shell关键字。
下面给出一个示例
#将一个数字赋值给变量x x=8 #将一个字符串赋值给变量hello hello="hello world"
注意赋值时变量名前不能加"$"号。
还可以用一个变量给另一个变量赋值。格式如下
变量2=$变量1
2、变量访问
如果要访问变量值,可以在变量名前加"$“即可。通常使用函数echo来显示变量,例如
#将一个数字赋值给变量x x=8 #将一个字符串赋值给变量hello hello="hello world" #显示hello的值 echo $hello
运行结果
有些时候为了避免变量名与其他字符串混淆,需要为变量名加上{}。例如
#将一个字符串赋值给变量skill skill="shell" #变量显示在字符中 echo "i am good at ${skill} script"
给所有变量加上{}是一个好习惯。
3、只读变量
使用readonly命令可以将变量定义为只读变量,只读变量不能被改变。例如
hello="helloworld" #将该变量定义为只读 readonly hello
4、删除变量
使用unset命令可以删除变量。语法如下:
unset 变量名
变量被删除后不能再次使用,unset命令不能删除只读变量。
5、添加环境变量
可以使用export命令将环境变量添加到环境中,作为临时的环境变量(一种全局变量)。基本用法如下:
export 变量名=变量值
该变量只在当前的Shell或其子Shell下有效,一旦Shell关闭了,变量就失效了,再打开新的Shell时,该变量就不存在了,如果需要使用,还需要重新定义。如果希望环境变量永不失效,则需要编辑配置文件(/etc/profile)。
export命令仅将变量加到环境中,如果要从程序的环境中删除该变量,则可以使用unset命令或者env命令,env也可临时的改变环境变量值。
3、内部变量
常用的内部变量如下
例如,执行以下命令可以查看当前的Shell进程ID
4、位置参数
上面内部变量中有几个表示运行脚本时传递给脚本的参数,通常称为位置参数或命令行参数。当编写一个带有若干参数的Shell脚本时,可以用命令行或从其他的Shell脚本调用它。位置参数使用系统给出的专用名,存放在变量中的第1个参数名为1,可以使用$1来访问,以此类推。当参数超过10个时,要用花括号将参数序列括起来,如${12}。
$0是要给比较特殊的位置参数,用于表示脚本自己的文件名。$*和$@都表示传递给函数或脚本的所有参数。$#是指传递参数的个数。
下面给出一个示例,用于显示位置参数。
#!/bin/bash echo "脚本文件名:$0" echo "第一个参数:$1" echo "第二个参数:$2" echo "引用值:$@" echo "引用值$*" echo "参数个数:$#"
将该脚本文件保存为example4后,如下方法运行传递参数。
调用Shell程序可以省略位置居后的位置参数。例如,Shell程序要求两个参数,可以只用第一个参数来调用,但是不能只利用第2个参数来调用。对于省略的较高位置参数,Shell将其视为空字符串处理,如上上面同样的字符可以这样运行
$*和$@在不被双引号" "包含时,都以"$1"、"$2"..."$n"的形式输出所有参数。但是当他们被包含时,"$* "会将所有参数作为一个整体,以"$1$2....$n"的形式输出所有参数。"$@”会将各个参数分开,还是按"$1"、"$2"..."$n"的形式输出。
在Shell程序中,可以利用set命令为位置参数赋值或重新赋值。set命令的一般格式为
set [参数列表]
该命令后面无参数时,将显示系统中的系统(环境)变量值;如果有参数,将分别给位置参数赋值,多个参数见用空格隔开。例如在上面脚本中第一行加上以下语句,从命令行提供的位置参数将被set所赋值取代。
set QQQ PPP #!/bin/bash echo "脚本文件名:$0" echo "第一个参数:$1" echo "第二个参数:$2" echo "引用值:$@" echo "引用值$*" echo "参数个数:$#"
运行结果
5、变量值输出
1、echo命令
Shell变量可以使用echo命令实现标准输出,在屏幕上打印出指定的字符串,之前的例子中已经详细用过了,这里不再赘述。
2、printf命令
printf命令用于格式化输出,可以看作echo的增强版。printf可以输出简单的字符串,但不会像echo那样自动换行。
6、变量值读取
通过键盘读入变量值,是Shell程序设计的基本交互手段之一。使用read命令可以将变量的值作为字符串从键盘读入,其基本用法如下:
read 变量
例如下面的语句表示从键盘读入字符串到str。
read str
在执行read命令时可以不指定变量参数,它会将接收到的数据放置在环境变量$REPLY中。
read读入的变量可以有多个,第一个数据给第一个变量,第二个数据给第二个变量,如果输入数据个数过多,则最后所有的值都给第一个变量。下面的脚本示例读取两个数,并显示出来。
#!/bin/bash read -p "请输入两个数字:" v1 v2 echo $v1 echo $v2
运行结果
还可以使用选项-n对输入的字符进行计数,当输入的字符数目达到预定数目时,自动退出,并将输入的数据赋值给变量。
7、变量替换
变量替换可以根据变量的状态(是否为空,是否定义等)来改变它的值。使用花括号来限定一个变量的开始和结束。可以使用以下几种变量替换形式。
${var}:替换为变量本来的值。
${var:-word}:如果变量var为空或已被删除,则返回word,但不改变var的值。
${var:=word}:如果变量var为空或已被删除,则返回word,并改变var的值为word。
${var:?message};如果变量var为空或已被删除,则将消息message发送到标准错误输出,可以用来检测变量var是否可以被正常赋值。这种替换出现在Shell脚本中,脚本将停止运行。
${var:+word};如果变量var被定义,则返回word,但不改变var的值。
下面为一个例子
echo ${var:-"变量未设置"} var=123456 echo "变量值为:${var}"
运行结果为
如果使用单引号来包括替换的变量,则变量替换将不起作用,仍然原样输出。例如:
8、数组
bash支持一维数组(不支持多维数组),并且没有限定数组的大小。与C语言类似,数组元素的下标由0开始编号,获取数组中的元素要利用下标,下标可以是整数或算术表达式,其值应大于或等于0.
在Shell中用括号来表示数组,数组元素用空格分开。数组定义的用法如下:
数组名=(值1...值n)
例如
array=(A B C D}
也可以单独定义数组的各个元素,如:
arry [0]=A arry [1]=B
可以不使用连续的下标,而且下标的范围没有限制。
读取数组元素值的语法格式为:
${数组名[下标]}
例如:
echo ${arry[1]}
使用@或*可以获取数组中的所有元素,例如
echo ${arry[@]}
echo ${arry[*]}
采用以下用法可以获取数组元素的个数:
echo {#数组名[@]}
以下用法用于取得数组单个元素的长度:
${#数组名[n]}