一、变量替换
1.概念
变量的名字就是变量保存值的地方。引用变量的值就叫做变量替换。
如果 variable 是一个变量的名字,那么 $variable
就是引用这变量的值,即这变量所包含的数据。
$variable
事实上只是 ${variable}
的简写形式。在某些上下文中 $variable
可能会引起错误,这时候你就需要用 ${variable}
了。
2.举例
$ vim test.sh
输入代码(中文皆为注释,不用输入):
#!/bin/bash
# 变量赋值和替换
a=375
hello=$a
#-------------------------------------------------------------------------
# 强烈注意, 在赋值的的时候, 等号前后一定不要有空格.
# 如果出现空格会怎么样?
# "VARIABLE =value"
# ^
#% 脚本将尝试运行一个"VARIABLE"的命令, 带着一个"=value"参数.
# "VARIABLE= value"
# ^
#% 脚本将尝试运行一个"value"的命令,
#+ 并且带着一个被赋值成""的环境变量"VARIABLE".
#-------------------------------------------------------------------------
echo hello # 没有变量引用, 只是个hello字符串.
echo $hello
echo ${hello}
echo "$hello"
echo "${hello}"
echo
程序截图:
运行:
hello="A B C D"
echo $hello # A B C D
echo "$hello" # A B C D
# 引用一个变量将保留其中的空白, 当然如果是变量替换就不会保留了.
# 在bash中,当变量中有空格、tab之类的字符时候,
# 如果需要打印这些字符,需要用双引号进行引用 "$hello".
echo
程序截图:
运行:
echo '$hello' # $hello
# ^ ^
# 全引用(单引号)的作用将会导致"$"被解释为单独的字符, 而不是变量前缀.
# 使用单引号引用变量时候,变量的值不会被引用,只是简单的保持原始字符串.
# 注意这两种引用所产生的不同的效果.
hello= # 设置为空值.
echo "\$hello (null value) = $hello"
# 注意设置一个变量为null, 与unset这个变量, 并不是一回事
#+ 虽然最终的结果相同(具体见下边).
程序截图:
运行:
# --------------------------------------------------------------
# 可以在同一行上设置多个变量,
#+ 但是必须以空白进行分隔.
# 慎用, 这么做会降低可读性, 并且不可移植.
var1=21 var2=22 var3=$V3
echo
echo "var1=$var1 var2=$var2 var3=$var3"
程序截图:
运行:
# --------------------------------------------------------------
echo; echo
numbers="one two three"
# ^ ^
other_numbers="1 2 3"
# ^ ^
# 如果在变量中存在空白,那么就必须加上引号
# other_numbers=1 2 3 # 将给出一个错误消息.
echo "numbers = $numbers"
echo "other_numbers = $other_numbers" # other_numbers = 1 2 3
# 不过也可以采用将空白转义的方法.
mixed_bag=2\ ---\ Whatever
# ^ ^ 在转义符后边的空格(\).
echo "$mixed_bag" # 2 --- Whatever
echo; echo
echo "uninitialized_variable = $uninitialized_variable"
# Uninitialized变量为null(就是没有值).
uninitialized_variable= # 声明, 但是没有初始化这个变量,
#+ 其实和前边设置为空值的作用是一样的.
echo "uninitialized_variable = $uninitialized_variable"
# 还是一个空值.
uninitialized_variable=23 # 赋值.
unset uninitialized_variable # Unset这个变量.
echo "uninitialized_variable = $uninitialized_variable" # 还是一个空值.
程序截图:
运行:
二、变量赋值
1.说明
赋值操作前后都不能有空白。
因为 =
和 -eq
都可以用做条件测试操作,所以不要与这里的赋值操作相混淆。
注意: =
既可以用做条件测试操作,也可以用于赋值操作,这需要视具体的上下文而定。bash中 ==
也可作为条件判断。
2.举例
$ vim test.sh
输入代码(中文皆为注释,不用输入):
#!/bin/bash
a=23 # 简单的赋值
echo $a
b=$a
echo $b
# 现在让我们来点小变化(命令替换).
a=`echo Hello!` # 把'echo'命令的结果传给变量'a'
echo $a
a=`ls -l` # 把'ls -l'的结果赋值给'a'
echo $a # 然而, 如果没有引号的话将会删除ls结果中多余的tab和换行符.
echo
echo "$a" # 如果加上引号的话, 那么就会保留ls结果中的空白符.
程序截图:
运行:
三、变量不区分类型
1.说明
与大多数编译型语言不同,Bash 并不区分变量的"类型"。本质上,Bash 变量都是字符串。但是依赖于具体的上下文,Bash 也允许比较操作和整数操作。其中的关键因素就是,为变量赋的值是否只有数字。
2.举例
$ vim test.sh
输入代码(中文皆为注释,不用输入):
#!/bin/bash
a=2334 # 整型.
let "a += 1"
echo "a = $a" # a = 2335
echo # 还是整型.
b=${a/23/BB} # 将"23"替换成"BB".
# 这将把变量b从整型变为字符串.
echo "b = $b" # b = BB35
declare -i b # 即使使用declare命令也不会对此有任何帮助,低版本bash下可能没有此命令
echo "b = $b" # b = BB35
# declare的命令是用于设置变量的属性,个别版本的bash可能没有此命令
let "b += 1" # BB35 + 1 =
echo "b = $b" # b = 1
echo
c=BB34
echo "c = $c" # c = BB34
d=${c/BB/23} # 将"BB"替换成"23".
# 这使得变量$d变为一个整形.
echo "d = $d" # d = 2334
let "d += 1" # 2334 + 1 =
echo "d = $d" # d = 2335
echo
程序截图:
运行:
# null变量会如何呢?
e=""
echo "e = $e" # e =
let "e += 1" # 算术操作允许一个null变量?
echo "e = $e" # e = 1
echo # null变量将被转换成一个整型变量.
# 如果没有声明变量会怎样?
echo "f = $f" # f =
let "f += 1" # 算术操作能通过么?
echo "f = $f" # f = 1
echo # 未声明的变量将转换成一个整型变量.
# 所以说Bash中的变量都是不区分类型的.
exit 0
程序截图:
运行:
四、特殊变量
1.局部变量
这种变量只有在代码块或者函数中才可见。
2.环境变量
这种变量将影响用户接口和 shell 的行为。
在通常情况下,每个进程都有自己的“环境”,这个环境是由一组变量组成的,这些变量中存有进程可能需要引用的信息。在这种情况下,shell 与一个一般的进程没什么区别。
3.位置参数
从命令行传递到脚本的参数:$0,$1,$2,$3...
$0
就是脚本文件自身的名字,$1
是第一个参数,$2
是第二个参数,$3
是第三个参数,然后是第四个。$9
之后的位置参数就必须用大括号括起来了,比如,${10},${11},${12}
。
两个比较特殊的变量 $*
和 $@
表示所有的位置参数。