Bash 中的右字符串扩展(对于 shell 脚本)
Right string expansion in Bash (for shell script)
我正在使用 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})
全部给出相同的结果(见上文)。我还扫描了 these docs 关于字符串扩展的内容,但我没有遇到 variables/strings 可能为空或未定义的问题。最后一个 echo
不是问题,您还可以将 $(git status)
的结果存储在一个变量中并回显这个(我在脚本中的方式)。
我知道,有 similar questions,但我还没有找到类似的情况,因为我只是处理简单的非空字符串,但有(太多?)很多引号。
有趣的变体:
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
。它将执行一个与 space command blabla
. 完全相同的文件名
- 在
$("git ${command}")
里面你要执行一个名为git commit -m 'test test'
的文件名(准确的说,这是完整的文件名,spaces,在${command}
展开后) .由于在您的系统上没有名为 git commit -m 'test test'
bash returns command not found. 的文件
我正在使用 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})
全部给出相同的结果(见上文)。我还扫描了 these docs 关于字符串扩展的内容,但我没有遇到 variables/strings 可能为空或未定义的问题。最后一个 echo
不是问题,您还可以将 $(git status)
的结果存储在一个变量中并回显这个(我在脚本中的方式)。
我知道,有 similar questions,但我还没有找到类似的情况,因为我只是处理简单的非空字符串,但有(太多?)很多引号。
有趣的变体:
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
。它将执行一个与 spacecommand blabla
. 完全相同的文件名
- 在
$("git ${command}")
里面你要执行一个名为git commit -m 'test test'
的文件名(准确的说,这是完整的文件名,spaces,在${command}
展开后) .由于在您的系统上没有名为git commit -m 'test test'
bash returns command not found. 的文件