我有一个用于初始化 dzen2 的 sh 脚本,我想使用 Source Code Pro 字体在那里使用。这是代码...
param="-p -dock -fn 'Source Code Pro-10'"
# the generated_output function is not important
generated_output | dzen2 $param
问题是,脚本不起作用! dzen2 没有启动...经过一番搜索后,我发现问题可能是由于单引号'
或双引号的一些问题而发生"
的,我不太明白...
我尝试过使用这个:
param=$'-p -dock -fn \'Source Code Pro-10\''
# or something like this
param='-p -dock -fn '"'"'Source Code Pro-10'"'"
仍然不起作用...
这个脚本有什么问题?
答案1
如果您想跟踪多个单独的字符串(参数)并稍后将它们用作单独的字符串,请不要将它们存储在同一个字符串中。使用数组代替:
param=(-p -dock -fn 'Source Code Pro-10')
generated_output | dzen2 "${param[@]}"
带引号的扩展"${param[@]}"
将扩展到数组中的字符串列表param
。请注意,这意味着这Source Code Pro-10
将是单身的论证,这就是你想要的。如果您忘记了扩展周围的引号,shell 将继续按$IFS
字符(默认情况下为空格、制表符和换行符)拆分每个字符串,然后将文件名通配应用于每个生成的单词。
您的代码依赖 shell 将字符串拆分-p -dock -fn 'Source Code Pro-10'
为命令的参数。由于 shell 默认按空格、制表符和换行符进行拆分,因此这将导致子字符串'Source Code Pro-10'
变成单独的参数'Source
、Code
和Pro-10'
(请注意,单引号也包含在字符串中)。
有关的:
在sh
脚本中,您可以使用位置参数列表:
set -- -p -dock -fn 'Source Code Pro-10'
generated_output | dzen2 "$@"
这在 shell 中也可以工作bash
。