变量引用的三种方式:
① $variable
② ${variable}
③“$variable”或“${variable}”
变量名外面的花括号是可选的,加不加都行,加花括号是为了帮助解释器识别变量的边界,比如下面这种情况:
-
for action in Reading Writing Changing
-
do
-
echo "I am good at ${action}Book"
-
done
如果不给action变量加花括号,写成echo "I am good at $actionBook",解释器就会把$actionBook当成一个变量(其值为空)
单引号、双引号
⑴ 单引号、双引号和反引号之间,从功能上可以分为两类:
① 引用字符串:单引号、双引号
② 命令替换:反引号
⑵ 讲讲单、双引号的功能和他两之间的区别:
① 功能:单引号和双引号都是引用字符串用的。他两中的命令都是不执行的,只作为字符的存在。
② 区别:
在双引号中,有些元字符是可以保留它的功能的,可以有含义的进行解释,而不是作为一个普通字符,这是双引号和单引号最大的区别。单引号中,不会有任何特殊符号的存在,所有的元字符,命令统统都是一个普通字符。双引号可以解释部分元字符,让它保留其原来的功能。
⑶ 下面举个例子来讲解一下,比如:
命令:echo “((n=60+60))”
输出:((n=60+60))
解释:首先((…))是一个命令,let数值计算命令的简写点击打开链接(注意和test命令的区分:点击打开链接)
分析:直接输出((60)),说明这个命令在双引号中并没有执行(当然在单引号中也肯定不会执行),为什么?
因为双引号中的字符都是一个普通字符。
问题来了:有没有办法让字符串中的有特别含义的东西,比如“命令”这些可以正常执行呢?
⑷ 双引号中特殊元字符
前面已经说了,双引号中的某些元字符是能够保留它的功能的,这种设计,使字符串中可以引用命令的结果。
那么双引号中的哪些字符是解释的呢,可以保留其原本含义的呢?
① 转义符号:\
② 变量引用、命令替换:$ (点击打开链接)
③ 反引号: ` (键盘“Esc”键下面的一个键)
如果我想正常输出这些在双引号中可以解释的元字符,使其作为一个普通字符;但是这个字符串中又有我想要的待解释命令(不能用单引号的原因),应该怎么办呢?双引号中的转义字符是解释的,可以使用转义符号来输出某个单个特殊符号。
反引号作用于命令替换。
命令替换的目的是获取命令的输出,为变量赋值,或对命令的输出做进一步处理。
反引号的作用和“$( )”是一样的。
export命令:将使系统在创建每一个新的shell时定义这个变量的一个拷贝。这个过程称之为变量输出。
source命令:使Shell读入指定的Shell程序文件并依次执行文件中的所有语句
原理:
执行脚本时是在一个子shell环境运行的,脚本执行完后该子shell自动退出;
一个shell中的系统环境变量才会被复制到子 shell中(用export定义的变量);
一个shell中的系统环境变量只对该shell或者它的子shell有效,该shell结束时变量消失 (并不能返回到父shell中)。
不用export定义的变量只对该shell有效,对子shell也是无效的。
通常把环境变量放在开发板的/etc/profile文件里面
export log=4
在其他脚本中直接引用,前面加上环境变量路径 source /etc/profile
可以直接在命令行输入export log=4进行修改
符号$后的括号区别
(1)${a} 变量a的值, 在不引起歧义的情况下可以省略大括号。
(2)$(cmd) 命令替换,和`cmd`效果相同,结果为shell命令cmd的输出,过某些Shell版本不支持$()形式的命令替换, 如tcsh。
(3)$((expression)) 和`exprexpression`效果相同, 计算数学表达式exp的数值, 其中exp只要符合C语言的运算规则即可, 甚至三目运算符和逻辑表达式都可以计算。