当值是命令的输出时,用于多变量值分配的Bash / GitBash语法不起作用

时间:2019-02-06 00:10:20

标签: bash shell git-bash multiple-assignment

我在Windows 7 64Bit中安装了GitforWindows 2.20.1。

现在,正如我在问题中所述,多变量赋值语法并不总是有效,尤其是当要赋值的是命令的输出时,即:

read -r a b c <<< $(echo 1 2 3) ; echo "$a|$b|$c"

有效,但这些无效:

read -r SCRIPTDIR MAGE2ROOT <<< $(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)
## OR ##
read -r -d "\n" SCRIPTDIR MAGE2ROOT <<< $(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)

如果我仅在此之后打印输出,则:

echo $SCRIPTDIR && echo $MAGE2ROOT && exit

它只打印一次路径。为什么?以及如何使它起作用?

需要任何帮助/指导。

1 个答案:

答案 0 :(得分:0)

read并未执行您想要的操作。如果它读取的“单词”不如要分配的变量那么多,它将多余的变量留为空白。在这种情况下,它只得到一个单词(脚本目录的路径),但是要分配两个变量(SCRIPTDIRMAGE2ROOT),因此它将SCRIPTDIR设置为路径,并且MAGE2ROOT留为空白。尝试第一个示例,但不提供足够的值来填充所有变量:

$ read -r a b c <<< $(echo 1 2 3) ; echo "$a|$b|$c"
1|2|3
$ read -r a b c <<< $(echo 1 2) ; echo "$a|$b|$c"
1|2|
$ read -r a b c <<< $(echo 1) ; echo "$a|$b|$c"
1||

幸运的是,这很容易使用MAGE2ROOT="$SCRIPTDIR"解决(如@OlliK所说)。实际上,根本没有使用read的意义,只需使用简单的分配即可:

SCRIPTDIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)
MAGE2ROOT="$SCRIPTDIR"