如何分隔没有空格的变量

时间:2017-07-02 01:37:34

标签: bash shell printf

我的问题类似于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"

我已经尝试过几乎所有事情,逃避变量,将它们放在引号中,没有运气。显然,我没有意识到这是处理这个问题的正确方法,所以任何帮助都很棒 - 谢谢。

1 个答案:

答案 0 :(得分:0)

如果你要做的是将mIRC colour codes插入字符串中 - 如果你这么说的话,你会更容易得到帮助 - 那么你需要注意两件事: / p>

  1. Gnu printf解释的C风格十六进制转义符的格式为\x,后跟两个十六进制数字。 (你只能使用一个数字,但前提是下一个字符不是十六进制数字。所以最好把它想象成两个数字。)编写一个control-C(字符代码3){ {1}}。 \x03x30是数字\x390的字符代码。转义代码的转换由printf完成,而不是由shell完成,因此首先进行参数替换。因此,如果9的值为1,则$one将由shell扩展为printf "\x3${one}",然后printf "\x31"将打印数字printf。我认为这不是你想要的,因为显然有更少的循环方式来插入变量的值,而不是将变量限制为单个十进制数字。

    并非所有1实现都处理十六进制转义,并非所有shell都具有内置printf。因此,虽然您可以将printf与bash一起使用,但您可能会发现它不可移植。但是,所有\x03实现都应该处理八进制转义,并且printf仍然是3八进制,但现在需要三位数:3

  2. mIRC颜色代码的格式为control-C,后跟最多两个以逗号分隔的数字。这些数字最多有两位数,如果颜色代码后面的下一个字符是数字,则必须使用两位数字。 (巧合地类似于上面的十六进制转义码,但它确实只是巧合。)因此,如果您希望文本\003具有前景色3和背景色1,则需要发送25;如果您发送^C1,0225^C,则会将其解释为前景色1和背景色25(不是有效的颜色代码),文本为^C1,225^C

    上面链接的mIRC文档中提到了这一点:

      

    注意:如果要为以数字开头的文本着色,则此语法要求您将颜色值指定为两位数。

  3. 所以更好的5调用可能是:

    printf

    注意:当然,我猜测你想要制作的字符串是完全错误的;这只是一个基于未删除的副手评论的猜测。如果是这样,并且如果您认真地回答问题,我强烈建议您使用printf "\003%02d,%02d%s\003" "$one" "$two" "$str" 语句准确地解释您尝试生成的字节字符串。