一、变量简介
在shell里,使用变量之前不需要声明,只是简单地通过使用它来创建它(比如:给它赋初值)。默认情况下,变量被当做字符串并以字符串存储,哪怕你赋给它的是数值也是如此,这点不同于Lua等脚本。shell在需要时会将数值型字符串转换为对应的数值以对它进行操作。Linux是大小写敏感,那么shell会认为变量foo与Foo是不同的。
在shell中,通过在变量名前加一个$符号来访问它的内容,但在为变量赋值时,只需要使用变量名即可。通常用echo $变量名来将其内容输出到终端上,比如:
#var=hello
#echo $var
hello
#var="hello world"
#echo $var
hello world
#var=2+1
#echo $var
2+1
需要注意的是:如果字符串里包含空格,必须用引号将其括起来,而且等号两边不能有空格。
我们可以通过使用read命令来将用户的输入赋值给某个变量,这个命令需要一个变量名来作为参数,用于等待接收用户输入的数据,用户按下回车结束read命令,比如:
#read var
hello world
#echo $var
hello world
二、使用引号
一般情况下,脚本文件中的参数以空白字符分割(空格、制表符或换行符),如果想在一个参数中包含一个或多个空白字符,就必须给参数加上引号。
如果你把一个带有$字符的变量放在双引号中,程序执行时则会把变量替换为它的值;如果你把一个带有$字符的变量放在单引号中,程序执行时则不会发生替换现象;当然你也可以通过在字符$前加一个\字符来取消它的特殊含义,引号在变量输出中的作用请参看下面脚本:
#!/bin/sh
var = "hi there"
echo $var
echo "$var"
echo '$var'
echo \$var
echo Enter some text
read var
echo '$var' now equals $var
exit 0
输出结果如下:
hi there
hi there
$var
$var
Enter some text
hello world --控制台输入
$var now equals hello world
三、环境变量
当shell脚本执行时,一些变量会根据环境设置中的值进行初始化,这些变量称之为环境变量。环境变量一般都用大写字母命名,为了不产生冲突,那么用户在脚本中自定义变量时最好用小写字母命名。
常用的环境变量有以下一些:
$HOME:当前用户的主目录
$PATH:以冒号分隔的用来搜索命令的目录列表
$PS1:命令提示符,通常是$字符,但在bash中,你可以使用一些更复杂的值,比如:字符串[\u@\h\W]$就是一个流行的默认值,它给出用户名、机器名和当前目录名,当然也包括一个$提示符
$PS2:二级提示符,用来提示后续的输入,通常是>字符
$IFS:输入域分隔符,当shell读取输入时,用来分隔单词的一组字符,它们通常是空格、制表符和换行符
$0:shell脚本的名字
$#:传递给脚本的参数个数
$$:shell脚本的进程号,脚本程序通常会用它来生成一个唯一的临时文件,比如:/tmp/tmpfile_$$
可以通过export命令设置环境变量。
四、参数变量
如果你的脚本程序在调用时带有参数,就会创建一些额外的变量。即使没有传递任何参数,环境变量$#也依然存在,只不过它的值是0而已。参数变量如下:
$1,$2,...:脚本程序的参数
$*:在一个变量中列出所有的参数,各个参数之间用环境变量IFS中的第一个字符分隔开,如果IFS为空时,各参数结合在一起
$@:它是$*的一种精巧的变体,它不是用IFS环境变量,所以当IFS为空时,参数的值不会结合在一起
具体如何运用,请参看如下:
$IFS=''
$set foo bar bam
$echo "$@"
foo bar bam
$echo "$*"
foobarbam
$unset IFS
$echo "$*"
foo bar bam
如你所见,双引号里面的$@把各个参数扩展为彼此分开的域,而不受IFS值的影响。一般来说,如果你想访问脚本程序的参数,用$@是明智的选择。
阅读(1971) | 评论(1) | 转发(0) |