在 bash 脚本中转义引号和大括号的问题

Posted

技术标签:

【中文标题】在 bash 脚本中转义引号和大括号的问题【英文标题】:Issue with escaping quotes and curly brackets in bash script 【发布时间】:2017-09-26 13:21:36 【问题描述】:

在 bash 脚本中转义引号和括号的问题 运行这个

a="\'copa\':\'copa2\'"
print "$a"

结果是:

'copa':'copa2'

在 sh 命令中使用 a 在 aws_instance_tag 语句中添加引号并删除 copa 值的单引号

sh "ansible-playbook playbooks/environment-provisioning.yml -e env=perf -e num_injectors_zone_a=2 -t performance_services -e aws_instance_tags=$a "

结果

ansible-playbook playbooks/environment-provisioning.yml -e env=perf -e
num_injectors_zone_a=2 -t performance_services -e
'aws_instance_tags=copa:copa2'

【问题讨论】:

这甚至不应该运行,因为您将引用的字符串作为参数/文件传递给 sh.假设您使用了 -c 并且这是一个错字,那么您的变量会经历两次 shell 扩展,一次是传递给 sh,一次是运行时,删除引号。 【参考方案1】:

不要对命令进行字符串化,而是尝试使用数组:

# define the array
cmd=(
    ansible-playbook 
    playbooks/environment-provisioning.yml 
    -e env=perf 
    -e num_injectors_zone_a=2 
    -t performance_services 
    -e aws_instance_tags="$a"
)
# then run it
"$cmd[@]"

【讨论】:

如此优雅的解决方案!我不得不使用eval "$cmd[@]" 这是为什么呢?不使用eval时发生了什么? 好点 - 通常不需要eval,但我的命令是(简化的)sed -i "'/sorange/,/eorange/ s/1/2/; s/A/B/ '" file,当没有eval 时,它在sed 上失败。 那是因为有两对引号。您不需要同时使用单引号和双引号。 仍然不需要单引号。

以上是关于在 bash 脚本中转义引号和大括号的问题的主要内容,如果未能解决你的问题,请参考以下文章

如何在 URI 中转义大括号

转义引号和大括号时遇到问题

如何在XAML中转义大括号

如何在 ssh / 远程 bash 命令中转义单引号字符?

string.format格式化字符串中转义大括号“{}”

如何在 Bash 中转义双引号? [复制]