shell-变量

变量类型

运行shell时,会同时存在三种变量:

  1. 局部变量
    局部变量在脚本或命令中定义,仅在当前shell实例中有效,其他shell启动的程序不能访问局部变量。
  2. 环境变量
    所有的程序,包括shell启动的程序,都能访问环境变量,有些程序需要环境变量来保证其正常运行。必要的时候shell脚本也可以定义环境变量。
  3. shell变量
    shell变量是由shell程序设置的特殊变量。shell变量中有一部分是环境变量,有一部分是局部变量,这些变量保证了shell的正常运行

定义变量

Shell 支持以下三种定义变量的方式:
variable=value
variable='value'
variable="value"

命名规则

Shell 变量的命名规范和大部分编程语言都一样:

  1. 变量名由数字、字母、下划线组成;
  2. 必须以字母或者下划线开头;
  3. 不能使用 Shell 里的关键字(通过 help 命令可以查看保留关键字)

使用变量

使用一个定义过的变量,只要在变量名前面加美元符号即可,如: author="严长生" echoauthor
echo ${author}
建议使用第二种加中括号的

修改变量的值

已定义的变量,可以被重新赋值,如:

url="http://c.biancheng.net"
echo ${url}
url="http://c.biancheng.net/cpp/shell/"
echo ${url}

第二次对变量赋值时不能在变量名前加,只有在使用变量时才能加

单引号和双引号的区别

url="http://c.biancheng.net"
website1='C语言中文网:${url}'
website2="C语言中文网:${url}"
echo $website1
echo $website2

运行结果:
C语言中文网:${url}
C语言中文网:http://c.biancheng.net

以单引号' '包围变量的值时,单引号里面是什么就输出什么,即使内容中有变量和命令(命令需要反引起来)也会把它们原样输出

只读变量

使用 readonly 命令可以将变量定义为只读变量,只读变量的值不能被改变
例子:

myUrl="http://see.xidian.edu.cn/cpp/shell/"
readonly myUrl
myUrl="http://see.xidian.edu.cn/cpp/danpianji/"

删除变量

使用 unset 命令可以删除变量。语法:
unset variable_name
变量被删除后不能再次使用;unset 命令不能删除只读变量。

myUrl="http://see.xidian.edu.cn/cpp/u/xitong/"
unset myUrl
echo $myUrl

变量赋值

Shell 也支持将命令的执行结果赋值给变量,常见的有以下两种方式:
variable=command
variable=$(command)
建议使用第二种

特殊变量

$0  当前脚本的文件名
$n  传递给脚本或函数的参数。n 是一个数字,表示第几个参数。例如,第一个参数是$1,第二个参数是$2。
$#  传递给脚本或函数的参数个数。
$*  传递给脚本或函数的所有参数。
$@  传递给脚本或函数的所有参数。被双引号(" ")包含时,与 $* 稍有不同,下面将会讲到。
$?  上个命令的退出状态,或函数的返回值。
$$  当前Shell进程ID。对于 Shell 脚本,就是这些脚本所在的进程ID。

转义字符

\\  反斜杠
\a  警报,响铃
\b  退格(删除键)
\f  换页(FF),将当前位置移到下页开头
\n  换行
\r  回车
\t  水平制表符(tab键)
\v  垂直制表符

命令替换

命令替换是指Shell可以先执行命令,将输出结果暂时保存,在适当的地方输出。
命令替换的语法:
command
例子:
DATE=date
echo "Date is DATE" USERS=`who | wc -l` echo "Logged in user areUSERS"
UP=date ; uptime
echo "Uptime is $UP"

变量替换

变量替换可以根据变量的状态(是否为空、是否定义等)来改变它的值

{var} 变量本来的值{var:-word} 如果变量 var 为空或已被删除(unset),那么返回 word,但不改变 var 的值。
{var:=word} 如果变量 var 为空或已被删除(unset),那么返回 word,并将 var 的值设置为 word。{var:?message} 如果变量 var 为空或已被删除(unset),那么将消息 message 送到标准错误输出,可以用来检测变量 var 是否可以被正常赋值。
若此替换出现在Shell脚本中,那么脚本将停止运行。
${var:+word} 如果变量 var 被定义,那么返回 word,但不改变 var 的值。