Bash中的右字符串扩展(用于shell脚本)
我正在尝试一个shell脚本,它应该在同一级别上为多个存储库运行git命令。这个项目结构可能是个坏主意,但这是另一回事 在我遇到这个问题之前,一切正常: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. 我也尝试
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}
bash的文件返回未找到的命令git commit-m'test test'
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}
bash的文件返回未找到的命令git commit-m'test test'
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
你只会得到第一个元素。你可以在函数内部本地实际命令=(“$@”)
。