【问题标题】:Issue with escaping quotes and curly brackets in bash script在 bash 脚本中转义引号和大括号的问题
【发布时间】: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,一次是运行时,删除引号。

标签: bash escaping curly-braces single-quotes


【解决方案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 上失败。
  • 那是因为有两对引号。您不需要同时使用单引号和双引号。
  • 仍然不需要单引号。
猜你喜欢
  • 2013-07-07
  • 1970-01-01
  • 1970-01-01
  • 2013-10-17
  • 2021-05-15
  • 1970-01-01
  • 2017-06-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多