Bash中的右字符串扩展(用于shell脚本)

Bash中的右字符串扩展(用于shell脚本),bash,shell,expansion,Bash,Shell,Expansion,我正在尝试一个shell脚本,它应该在同一级别上为多个存储库运行git命令。这个项目结构可能是个坏主意,但这是另一回事 在我遇到这个问题之前,一切正常: DETAIL="test test" && command="commit -m '${DETAIL}'" && echo $(git ${command}) # -> error: pathspec 'test'' did not match any file(s) known to git. 我也尝试

我正在尝试一个shell脚本,它应该在同一级别上为多个存储库运行git命令。这个项目结构可能是个坏主意,但这是另一回事

在我遇到这个问题之前,一切正常:

DETAIL="test test" && command="commit -m '${DETAIL}'" && echo $(git ${command})
# -> error: pathspec 'test'' did not match any file(s) known to git.
我也尝试过其他机会,比如

DETAIL="test test" && command="commit -m ${DETAIL}" && echo $(git ${command})
DETAIL="test test" && command="commit -m $DETAIL" && echo $(git ${command})
所有结果都相同(见上文)。我还扫描了字符串扩展,但没有问题,变量/字符串可能为null或未定义。最后一个
echo
不是问题,您还可以将
$(git status)
的结果存储在一个变量中,然后回显这个变量(我在脚本中的方式)

我知道有,但我还没有发现类似的情况,因为我只是处理简单的非空字符串,但是引用太多了

有趣的变体:

DETAIL="test test" && command="commit -m '${DETAIL}'" && echo $("git ${command}")
# -> git commit -m 'test test': command not found # WHAT?
也很有趣,只是:

command="commit -m 'test'" && echo $(git ${command})

工作正常。

使用带有正确引号的bash数组

DETAIL="test test" && command=(commit -m "$DETAIL") && git "${command[@]}"
您的代码:

  • echo“$(command)”
    command
    相同(确定,删除尾随的空换行符)
  • “command blabla”
    不使用第一个参数
    blabla
    执行文件
    command
    。它将执行一个完全用空格
    命令blabla
    命名的文件名
  • $(“git${command}”)
    中,您希望执行名为
    git commit-m'test test'
    的文件名(确切地说,这是整个文件名,在展开
    ${command}
    后加空格)。在您的系统上,没有名为
    git commit-m'test test'
    bash的文件返回未找到的命令

使用带有正确引号的bash数组

DETAIL="test test" && command=(commit -m "$DETAIL") && git "${command[@]}"
您的代码:

  • echo“$(command)”
    command
    相同(确定,删除尾随的空换行符)
  • “command blabla”
    不使用第一个参数
    blabla
    执行文件
    command
    。它将执行一个完全用空格
    命令blabla
    命名的文件名
  • $(“git${command}”)
    中,您希望执行名为
    git commit-m'test test'
    的文件名(确切地说,这是整个文件名,在展开
    ${command}
    后加空格)。在您的系统上,没有名为
    git commit-m'test test'
    bash的文件返回未找到的命令

太好了,谢谢。现在,我正在努力将这个数组注入到一个局部函数中,并将它直接放到那里。这里runCommand是我的本地函数:
declare-a commandArray=(“commit”“-m”“${DETAIL}”)-下一行-
运行命令$commandArray
。然后在函数内部:
local actualCommand=$@
-然后-
result=$(git${actualCommand[@]})
bash
没有一级数组值。当你说某物是一个数组时,它只是意味着名称上有一个属性集,允许你使用索引。如果
arr=(1“2 3”4)
,那么:
f“${arr[@]}”
等于
f1“2 3”4
。但是
f${arr[@]}
等于
f 1 2 3 4
,即
问题。只有
“${arr[@]}”
将被正确地检查。使用
$arr
您将只得到第一个元素。您可以在函数中
本地实际命令=(“$@”)
。太好了,谢谢。现在我正在努力将这个数组注入到本地函数中并将其实现。这里runCommand是我的本地函数:
declare-a commandArray=(“commit”“-m”“${DETAIL}”);
-下一行-
运行命令$commandArray
。然后在函数内部:
本地实际命令=$@
-然后-
结果=$(git${actualCommand[@]})
bash
没有一流的数组值。当你说某个东西是数组时,它只是意味着名称上有一个属性集,允许你使用索引。它实际上是一组不同变量上的一层薄薄的语法糖。如果
arr=(1“2 3”4)
,那么:
f“${arr[@]}“
等于
f1”23“4
。但是
f${arr[@]}
等于
f 1 2 3 4
,也就是说
很重要。只有
“${arr[@]}”
会被正确地检查。使用
$arr
你只会得到第一个元素。你可以在函数内部
本地实际命令=(“$@”)