运行Bash脚本时如何保留多层引号嵌套中的单引号字符
问题原因
Bash中单引号包裹的字符串内无法直接嵌套单引号,你原脚本中'{"prop": "My best 'app'"}' 会被Bash解析为三段拼接:
- 第一段单引号字符串:
'{"prop": "My best ' - 未被引号包裹的普通字符串:
app - 第二段单引号字符串:
'"}'
三段拼接后内层的单引号直接被丢弃,就出现了你看到的执行结果。
修复方案
这里提供三种常用的可行写法,都能保留app两侧的单引号:
方案1:单引号嵌套转义法
单引号内要插入单引号时,使用'\''格式(先闭合外层单引号、转义插入一个单引号、再重新开启外层单引号),修改后的脚本如下:
#!/usr/bin/env bash java -jar some.jar --test='{"prop": "My best '\''app'\''"}'
执行bash -x main.sh可以看到输出为:
+ java -jar some.jar '--test={"prop": "My best '\''app'\''"}'
参数内的单引号会被正确保留。
方案2:双引号包裹法
改用双引号包裹整个参数,只需要转义内部的JSON双引号即可,内部单引号不需要额外处理:
#!/usr/bin/env bash java -jar some.jar --test="{\"prop\": \"My best 'app'\"}"
方案3:变量预存法(可读性更高)
如果参数比较复杂,推荐先把参数值存入变量再引用,避免嵌套混乱:
#!/usr/bin/env bash TEST_PARAM='{"prop": "My best '\''app'\''"}' java -jar some.jar --test="$TEST_PARAM"
内容的提问来源于stack exchange,提问作者Prateek
相关产品推荐
相关产品推荐

