我重新设计了这个示例以使其简单,但我想做的是在 bash shell 执行它时获取一个嵌套双引号字符串作为单个 argv 值。
这是脚本示例:
set -x
command1="key1=value1 \"key2=value2 key3=value3\""
command2="keyA=valueA keyB=valueB keyC=valueC"
echo $command1
echo $command2
输出是:
++ command1='key1=value1 "key2=value2 key3=value3"'
++ command2='keyA=valueA keyB=valueB keyC=valueC'
++ echo key1=value1 '"key2=value2' 'key3=value3"'
key1=value1 "key2=value2 key3=value3"
++ echo keyA=valueA keyB=valueB keyC=valueC
keyA=valueA keyB=valueB keyC=valueC
我也进行了测试,当您在命令行上执行所有操作时,嵌套的引号消息将设置为单个 argv 值。 IE。
prog.exe argument1 "argument2 argument3"
argv[0] = prog.exe
argv[1] = argument1
argv[2] = argument2 argument3
使用上面的例子:
command1="key1=value1 \"key2=value2 key3=value3\""
错误是,我的 argv 返回如下:
arg[1] = echo
arg[2] = key1=value1
arg[3] = "key2=value2
arg[4] = key3=value3"
我真的希望我的 argv[3] 值为“key2=value2 key3=value3”
我注意到 debug (set -x) 在我的参数被破坏的地方显示了一个单引号,这有点表明它正在考虑这些断点处的参数......只是不确定。
知道这里到底发生了什么吗?我怎样才能更改脚本?
提前致谢。
发生的情况是您的嵌套引号是文字,并且不会被 shell 解析为单独的参数。处理这个问题的最好方法是使用bash
是使用数组而不是字符串:
args=('key1=value1', 'key2=value2 key3=value3')
prog.exe "${args[@]}"
The Bash 常见问题50 http://mywiki.wooledge.org/BashFAQ/050还有一些动态命令的更多示例和用例。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)