我希望在执行命令之前回显命令。此命令替换字符串' PROJECT_NAME'与'Hello world'在file.yaml。
PROJECT_NAME="Hello world"
CMD="replace.py 'PROJECT_NAME' '${PROJECT_NAME}' file.yaml"
echo "${CMD}"
${CMD}
引用此字符串的正确方法是什么,以便命令执行,echo将显示命令?
请注意,变量$ {PROJECT_NAME}的值包含空格,而replace.py只需要3个参数。
我尝试转义所有引号(\')和美元符号(\ $)。我尝试用双引号(")交换单引号(')。
通过一些引用,它会处理" Hello world"中的每个单词。作为一个单独的arg,所以replace.py会扼杀" world"不是它期望的文件名。
我已阅读http://mywiki.wooledge.org/BashFAQ/050,但仍无法弄明白。我不想复制命令或使用set -x(因为它在使用它时打印set + x将其关闭)。
答案 0 :(得分:1)
一种可能性是使用数组而不是普通字符串,然后使用printf
的{{1}}格式在需要时重新添加引号和/或转义符:
%q
请注意,这可能不会使用您在创建数组时使用的相同引用/转义方法;例如,我尝试了以上内容并打印出来:
PROJECT_NAME="Hello world"
CMD=(replace.py 'PROJECT_NAME' "${PROJECT_NAME}" file.yaml)
printf "%q " "${CMD[@]}"; printf "\n"
"${CMD[@]}"
相当于:
replace.py PROJECT_NAME Hello\ world file.yaml
......只是编写相同命令的另一种方式。
答案 1 :(得分:1)
存储命令行并稍后执行它的正确方法可以通过两种方式完成:
<强> 1。使用BASH数组:
PROJECT_NAME="Hello world"
cmd=("replace.py" "PROJECT_NAME" "$PROJECT_NAME" "file.yaml")
printf "%q " "${cmd[@]}"; echo
"${cmd[@]}"
现在将其运行为:
bash ./script.sh
replace.py PROJECT_NAME Hello\ world file.yaml
请注意%q
printf
的{{1}}空格。您也可以直接从shell运行此命令行以再次验证它,即
replace.py PROJECT_NAME Hello\ world file.yaml
<强> 2。使用功能:
#!/bin/bash
PROJECT_NAME="Hello world"
cmd() {
set -x
replace.py "PROJECT_NAME" "$PROJECT_NAME" "file.yaml"
set +x
}
cmd
现在将其运行为:
./script.sh
你会得到类似的输出:
+ replace.py PROJECT_NAME 'Hello world' file.yaml
...
...
set +x
您也可以运行此命令行:
replace.py PROJECT_NAME 'Hello world' file.yaml