在 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 脚本中转义引号和大括号的问题的主要内容,如果未能解决你的问题,请参考以下文章