8.3 变量
变量类型:局部变量和环境变量。局部变量仅在创建它的shell中有效,环境变量则对所有川剧它的shell所派生出来的子进程都有效。某些变量由由用户来创建,而另一些则是shell的特殊变量。
命名规则。变量名必须以字母或下划线开始,其余部分则可以由字符,数字(0~9)或下划线字符组成,而其他字符均可作为变量名的结束标志。名字是大小写敏感的。当给一个变量赋值时,不要在等号两边留下空格。如果要将变量赋值为空,要在等号后直接跟一个换行符。创建局部变量的最简单方法时以下面的格式八值赋予变量:
格式:variable=value 例子:name=Tommy
Declare内置命令。有两个内置命令declare和typeset可用于创建变量,通过选项还可以控制设置变量的方式。Typeset命令与declare命令完全一样。
没有参数的declare命令将列出所有设置的变量。通常只读变量是不能重新赋值或撤销的。如果用declare命令创建只读变量,他们不能被撤销,但可以被重新赋值。整型变量也能用declare来赋值。
Declare选项
选项 | 含义 |
-f | 列出函数名及其定义 |
-r | 将变量设置为只读 |
-x | 将变量名导出到子shell中 |
-i | 将变量置为整型 |
-a | 将变量当作数组,即给元素赋值 |
-F | 只列出函数名 |
8.3.1局部变量和范围
变量的范围是指变量在一个程序中的什么地方是可见的。对于shell而言,局部变量的范围限于创建变量的shell.
当个一个变量赋值的时候,不要在等号两边留下空格。如果要将一个变量设置为空,在等号后面跟一个换行符即可。
变量前面的美元符号用于提取其存储的值。
设置变量。局部变量可通过将值赋予一个变量名来设置,或者使用内置命令declare来设置。
8.3.2 环境变量
环境变量是能为川剧它的shell及其派生子进程所用的变量,它们也经常被称为全局变量以区分局部变量。一般约定环境变量为大写,他们是可以通过内置命令export导出的变量。
要设置环境变量,必须在给变量赋值或设置了变量后使用export命令。
Exprot命令及其选项
选项 | 值 |
-- | 选项段的结束标志,余下的都是参数 |
-f | Name-value形式被视为函数而不是变量 |
-n | 将全局变量(已导出)转换为局部变量,该变量将不会导出到子进程中 |
-p | 显示所有的全局变量 |
Bash环境变量
清空变量。如果未被设置为只读属性的话,本地办理和环境变量都可以通过使用unset命令清空。Unset命令把变量从shell内存中删除。
打印变量的值:echo命令。内建命令echo的作用是将其参数打印到标准输出。-e选项使得echo命令可以无限制地使用转义序列控制输出的效果
Echo命令选项
-e 允许翻译如下所有的转义序列
-n 把换行符压缩到输出行的末尾
-Ea 关闭对转义符号的翻译,包括关闭对那些默认情况下翻译的转义符号的翻译。
Printf命令
变量扩展修改符(参量扩展)。通过特定的修改符,可以检验和修改变量。这些修改符提供了一个快捷的方法来检验变量是不是被设置过,并把输出结果输出到一个变量中。
变量修改符
修改符 | 解释 |
${variable:-word} | 如果变量被设置了而且非空(null)就替代变量的值,否则就替换word |
${variable:=word} | 如果变量被设置了非空就替代变量的值,否则就把变量永久设置为word |
${variable:+word} | 如果变量被设置了非空就替代word。否则什么也不做。 |
${variable:?word} | 如果变量被设置了非空就替代变量的值,否则就打印word,然后退出shell.如果word为空就打印“parameter null or not set” |
${variable:offset} | 从offset位置开始提取变量的值的子字符串,如果offset为0就提取整个字符串 |
${variable:offset:length} | 从变量值的offset位置开始提取长度为length的子字符串。 |
子字符串的变量扩展
模式匹配参数用来从字符串的前边或者后边,去掉特定的部分字符串。最常用的方法就是从路径中去点路径名。
变量扩展字符串
表达式 | 功能 |
${variable%pattern} | 变量的值与模式符合smallest trailing portion就删除它 |
${variable%%pattern} | 变量的值与模式符合largest trailing portion就删除它 |
${variable#pattern} | 变量的值与模式符合smallest leading portion就删除它 |
${variable##pattern} | 变量的值与模式符合 largest leading portion就删除它 |
${#variable} | 替换变量中字母的个数。如果*或者@,长度就是位置参量的个数 |
位置参量。通常情况下,特定的内键变量,被成为位置参量,他们被用于从命令行向脚本传递参数,或者在函数中用于报错传递给函数的参数。
位置参量
表达式 | 功能 |
$0 | 当前脚本的名字 |
$1-9 | 位置参量1~9 |
${10} | 位置参量10 |
$# | 位置参量的个数 |
$* | 向所有的位置参量赋值 |
$@ | 同$*,有双引号时除外 |
“$*” | 赋值到“$1 $2 $3”等等 |
“$@” | 赋值到”$1” “$2” “$3”等等 |
特殊变量
变量 含义
$ shell的PID
- 当前sh的选项
? 最后一个命令退出状态值
! 最后一个放入后台作业的PID值
8.3.3引用
引用可以保护特殊的元字符不被翻译,防止参数扩展。有三种引用的方法:反斜线,单引号和双引号。下面是需要引用的特殊元字符。
元字符 含义
; 命令分割符
& 后台处理
() 命令组,创建一个子shell
{} 命令组,但是不创建一个子shell
| 管道
< 输入重新定向
Ø 输出重新定向
Newline 命令终止
Space/tab 单词分隔符
$ 变量替换
*[]? 用于文件名扩展的shell通配符
反斜线用来保护一个字母不被翻译。如果把反斜线放在一对括号中,它就不被翻译。反斜线可以保护美元符号,反引号和双引号中的反斜线。
单引号必须成对使用,它可以保护所有的字符不被翻译。要打印一个单引号就必须使用双引号或者反斜线来引用它。
双引号。双引号必须成对出现,他们允许变量和命令替换,单是保护其他符号不被翻译。
8.3.4命令替换
在需要把命令的输出结果赋值给一个变量或者需要用字符串替换变量的输出结果时,我们可以使用变量替换。所有的shell都使用反引用的方法进行替换。Bash有两种命令替换的方法:一种是老的方法把命令放在反引号中,另一种是新的风格,把命令放在一对圆括号中,并在前面缀上一个美元符号。