bash 子字符串语法作为消除环境变量标识符歧义的一种方法

bash 子字符串语法作为消除环境变量标识符歧义的一种方法

在抨击时,我知道如果环境变量 (EV) 包含嵌入空格,有时需要使用双引号。例如:"$JACK"而不是$JACK。如果 EV 的标识符不明确,有时建议使用从子字符串借用的语法。例如,因为 EV 不是$JACKA$JACKAN$JACKAND我们也不会使用没有子字符串索引的花括号来写${JACK}ANDJILL

双引号似乎也能达到同样的效果。例如:"$JACK"ANDJILL

事实上,如果我们什么都不做,echo以下内容就证明了等价性。

#!/bin/bash
TEXAS="asdf asdf"
FLORIDA="qwer""$TEXAS""qwer" # use quotes
echo $FLORIDA

ALABAMA="qwer"${TEXAS}"qwer" # use substring without indices
echo $ALABAMA

ARIZONA="qwer""${TEXAS}""qwer" # use both
echo $ARIZONA

MAINE="qwer"$TEXAS"qwer" # use neither
echo $MAINE

NEVADA="qwer""$TEXAS"qwer # last bit not quoted
echo $NEVADA

IDAHO="qwer"${TEXAS}qwer # last bit not quoted
echo $IDAHO

输出:

    qwerasdf asdfqwer
    qwerasdf asdfqwer
    qwerasdf asdfqwer
    qwerasdf asdfqwer
    qwerasdf asdfqwer
    qwerasdf asdfqwer

是否存在无法用双引号替代子字符串技巧的 bash 语句/构造?

答案1

Substring 具有更多功能,顾名思义,它可用于获取变量的子字符串。
例如

var='123456789'
echo ${var:2:4}

将输出

3456

使用数组时,必须使用子字符串来访问数组变量。
例如

a[0]=0
a[1]=1
a[2]=2

echo $a将打印 0。
echo "$a[1]"输出 0[1]
因此访问位置 1 处的数组变量如下

echo ${a[1]}

输出 1

echo "${a[@]}"输出所有变量。即 0 1 2 在这些情况下,子字符串不能用“”重新替换

相关内容