陈斌彬的技术博客

Stay foolish,stay hungry

Bash - 变量替换

一、变量替换

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

程序截图:

img

运行:

img

hello="A B  C     D"
echo $hello   # A B C D
echo "$hello" # A B  C     D
# 引用一个变量将保留其中的空白, 当然如果是变量替换就不会保留了.
# 在bash中,当变量中有空格、tab之类的字符时候,
# 如果需要打印这些字符,需要用双引号进行引用 "$hello".

echo

程序截图:

img

运行:

img

echo '$hello'  # $hello
#     ^           ^
# 全引用(单引号)的作用将会导致"$"被解释为单独的字符, 而不是变量前缀. 
# 使用单引号引用变量时候,变量的值不会被引用,只是简单的保持原始字符串.

# 注意这两种引用所产生的不同的效果.

hello=    # 设置为空值.
echo "\$hello (null value) = $hello"
#  注意设置一个变量为null, 与unset这个变量, 并不是一回事
#+ 虽然最终的结果相同(具体见下边).

程序截图:

img

运行:

img

# --------------------------------------------------------------

#  可以在同一行上设置多个变量, 
#+ 但是必须以空白进行分隔.
#  慎用, 这么做会降低可读性, 并且不可移植.

var1=21  var2=22  var3=$V3
echo
echo "var1=$var1   var2=$var2   var3=$var3"

程序截图:

img

运行:

img

# --------------------------------------------------------------

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" # 还是一个空值.

程序截图:

img

运行:

img

二、变量赋值

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结果中的空白符.               

程序截图:

img

运行:

img

三、变量不区分类型

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

程序截图:

img

运行:

img

# 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

程序截图:

img

运行:

img

四、特殊变量

1.局部变量

这种变量只有在代码块或者函数中才可见。

2.环境变量

这种变量将影响用户接口和 shell 的行为。

在通常情况下,每个进程都有自己的“环境”,这个环境是由一组变量组成的,这些变量中存有进程可能需要引用的信息。在这种情况下,shell 与一个一般的进程没什么区别。

3.位置参数

从命令行传递到脚本的参数:$0,$1,$2,$3...

$0 就是脚本文件自身的名字,$1 是第一个参数,$2 是第二个参数,$3 是第三个参数,然后是第四个。$9 之后的位置参数就必须用大括号括起来了,比如,${10},${11},${12}

两个比较特殊的变量 $*$@ 表示所有的位置参数。