Shell 语法
1 变量
在shell中,使用变量之前不需要事先声明的。在默认情况下,所有变量都被看作字符串并以字符串来存储,即使它们被赋值为数值时也是如此。shell和一些工具程序会在需要时把数值型字符串转换为对应的数值以对它们进行操作。Linux是一个区分大小写的系统。
在shell中,你可以通过在变量名前加一个$符号来访问它的内容。赋值的时候,只需要通过变量名。一种检查变量内容的简单方式如下:
echo $变量名
1.1 使用引号
一般情况下,脚本文件中的参数以空白字符分隔(例如,一个空格、一个制表符或者一个换行符)。如果你想在一个参数中包含一个或多个空白字符,你就必须给参数加上引号。
像
foo这样的变量在引号中的行为取决于你所用的引号类型,如果你把一个
f
o
o
这
样
的
变
量
在
引
号
中
的
行
为
取
决
于
你
所
用
的
引
号
类
型
,
如
果
你
把
一
个
变量表达式放在引号中,程序执行到这一行时就会把变量替换为它的值;如果你把它放在单引号中,就不会发生替换现象。你还可以通过在
符号前加一个\字符以取消它的特殊含义。 字符串通常都被放在双引号中,以防止变量被空白字符分开,同时又允许
符
号
前
加
一
个
\字
符
以
取
消
它
的
特
殊
含
义
。
字
符
串
通
常
都
被
放
在
双
引
号
中
,
以
防
止
变
量
被
空
白
字
符
分
开
,
同
时
又
允
许
扩展。
变量的使用
#!/bin/sh
myvar = "Hello world!"
echo $myvar
echo "$myvar"
echo '$myvar'
echo \$myvat
echo Enter some text
read myvar
echo '$myvar' now equals $myvar
exit 0
输出结果如下:
$ ./variable
Hello world!
Hello world!
$myvar
$myvar
Enter some text
Hello world // 输入的内容
$myvar now equals Hello World
1.2 环境变量
当一个shell脚本程序开始执行时,一些变量会根据环境设置中的值进行初始化。这些变量通常用大写字母做名字,以便把它们和用户在脚本程序中定义的变量区开来,后者按惯例都是用小写字母做名字。具体创建的变量取决于你的个人配置。在系统的送手册中列出了许多这样的环境变,如下所示:
- $HOME 当前用户的家目录
- $PATH 以冒号分隔的用来搜索命令的目录列表
- $PS1 命令提示符通常是$字符,但在bash中,你可以使用一些复杂的值。例如,字符创[\u@\h \w]]$就是一个流行的默认值,它给出用户、机器名和当前目录名,当然也包括一个$提示符。
- PS2 二级提示符,用来提示后续的输入,通常是>字符
- IFS 输入域分隔符。当shell读取输入时,它给出用来分隔单次的一组字符,他们通常是空格、制表符和换行符
- $0 shell脚本名字
- $# 传递给脚本的参数个数
- $$ shell脚本的进程号,脚本程序通常会用它来生产一个唯一的临时文件,如/tmp/tmpfile_$$
1.3 参数变量
如果脚本你程序在调用时带有参数,一些额外的变量就会被创建。即使没有传递任何参数,环境变量$也依然存在,只不过它的值是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值的影响。一般来说,如果你想访问脚本程序的参数,使用$@是明智的选择。
除了使用echo命令查看变量的内容外,你还可以使用read命令读取它们的值。