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]}

  

 

posted @ 2018-04-15 12:33  noticeable  阅读(514)  评论(0编辑  收藏  举报