我有一个用于初始化 dzen2 的 sh 脚本,我想使用 Source Code Pro 字体在那里使用。这是代码...
param="-p -dock -fn 'Source Code Pro-10'"
# the generated_output function is not important
generated_output | dzen2 $param
Run Code Online (Sandbox Code Playgroud)
问题是,脚本不起作用!dzen2 没有启动...经过一番搜索后,我发现问题可能是由于单引号'或双引号的一些问题而发生的",我不太明白...
我尝试过使用这个:
param=$'-p -dock -fn \'Source Code Pro-10\''
# or something like this
param='-p -dock -fn '"'"'Source Code Pro-10'"'"
Run Code Online (Sandbox Code Playgroud)
仍然不起作用...
这个脚本有什么问题?
如果您想跟踪多个单独的字符串(参数)并稍后将它们用作单独的字符串,请不要将它们存储在同一个字符串中。使用数组代替:
param=(-p -dock -fn 'Source Code Pro-10')
generated_output | dzen2 "${param[@]}"
Run Code Online (Sandbox Code Playgroud)
带引号的扩展"${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 "$@"
Run Code Online (Sandbox Code Playgroud)
这在 shell 中也可以工作bash。