为什么引用变量扩展中的引用在bash中运行良好?

时间:2016-08-27 14:12:26

标签: bash

我在bash中学习引用。 我有一个代码

unset unset_var
test_var="${unset_var:-"abc"}"
echo "test_var = $test_var"
tset_var = abc

我的问题来自“$ {unset_var: - ”abc“}”

我以两种方式中断了这条线,

第一种方式是

"${unset_var:-"abc"}" =
(quoted string: "${unset_var:-") +
(unquoted string: abc) +
(quoted string: "}")

第二种方式是

"${unset_var:-"abc"}" =
("${}") + (abc:-"abc")

第一种方式对我来说很直观。

第二种方式类似于来自parent-shell的子shell中的独立引用,如

"$(command "aug")"  # quote in sub-shell is independent from one in parent-shell

我在bash手册中找不到这个问题的说明。

有人知道它是如何工作的,请告诉我。谢谢。

1 个答案:

答案 0 :(得分:2)

在表格

的任何转让声明中
name=value

value会进行引号删除,即删除任何不属于value扩展结果的引号。

使用

test_var="${unset_var:-"abc"}"

参数扩展周围的引号显然不是任何扩展的结果,因此它们将被删除。问题是,如何处理内部引用?

根据手册页,

  

在[${parameter:-word}]中,word受波形扩展,参数扩展,命令替换和算术扩展的影响。"

但是,由于"abc"未经历四个命名扩展中的任何一个,因此周围的引号不是扩展的产物,因此每个引用删除都会删除。因此,

test_var="${unset_var:-"abc"}"

相当于

test_var="${unset_var:-abc}"

相当于

test_var=abc