我的问题类似于to this one,但并非如此。
问题是我的脚本中有变量,它们会直接在前一个旁边回显/ printf控制字符。不幸的是,我必须在变量之间加上空格或者所有内容都被误解,但这也不会起作用,因为我们之间不能有空格。
| c1, c2, c3, c4 |
-------------------
| A | B |09:00| Dc|
| A | C |22:00| Dd|
| B | C |09:00| De|
(没有空格,这个字符串混乱)
str="25 cents"
one=1
two=2
printf "\x3${one},${two}${str}\x30"\
所以它最终是printf "\x3${one},${two}%s\x30" "${str}" # outputs "5 cents"
(错误)或" 25 cents "
(错误的x 2)......它应该是:
"5 cents"
我已经尝试过几乎所有事情,逃避变量,将它们放在引号中,没有运气。显然,我没有意识到这是处理这个问题的正确方法,所以任何帮助都很棒 - 谢谢。
答案 0 :(得分:0)
如果你要做的是将mIRC colour codes插入字符串中 - 如果你这么说的话,你会更容易得到帮助 - 那么你需要注意两件事: / p>
Gnu printf
解释的C风格十六进制转义符的格式为\x
,后跟两个十六进制数字。 (你只能使用一个数字,但前提是下一个字符不是十六进制数字。所以最好把它想象成两个数字。)编写一个control-C(字符代码3){ {1}}。 \x03
到x30
是数字\x39
到0
的字符代码。转义代码的转换由printf完成,而不是由shell完成,因此首先进行参数替换。因此,如果9
的值为1,则$one
将由shell扩展为printf "\x3${one}"
,然后printf "\x31"
将打印数字printf
。我认为这不是你想要的,因为显然有更少的循环方式来插入变量的值,而不是将变量限制为单个十进制数字。
并非所有1
实现都处理十六进制转义,并非所有shell都具有内置printf
。因此,虽然您可以将printf
与bash一起使用,但您可能会发现它不可移植。但是,所有\x03
实现都应该处理八进制转义,并且printf
仍然是3
八进制,但现在需要三位数:3
。
mIRC颜色代码的格式为control-C,后跟最多两个以逗号分隔的数字。这些数字最多有两位数,如果颜色代码后面的下一个字符是数字,则必须使用两位数字。 (巧合地类似于上面的十六进制转义码,但它确实只是巧合。)因此,如果您希望文本\003
具有前景色3和背景色1,则需要发送25
;如果您发送^C1,0225^C
,则会将其解释为前景色1和背景色25(不是有效的颜色代码),文本为^C1,225^C
。
上面链接的mIRC文档中提到了这一点:
注意:如果要为以数字开头的文本着色,则此语法要求您将颜色值指定为两位数。
所以更好的5
调用可能是:
printf
注意:当然,我猜测你想要制作的字符串是完全错误的;这只是一个基于未删除的副手评论的猜测。如果是这样,并且如果您认真地回答问题,我强烈建议您使用printf "\003%02d,%02d%s\003" "$one" "$two" "$str"
语句准确地解释您尝试生成的字节字符串。