【问题标题】:How to separate variables without spaces如何在没有空格的情况下分隔变量
【发布时间】:2017-07-02 01:37:33
【问题描述】:

我的问题与to this one 类似,但并非如此。

问题是我的脚本中有变量会直接在前一个旁边回显/打印控制字符。不幸的是,我必须在变量之间放置空格,否则一切都会被误解,但这也行不通,因为它们之间不能有空格。

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 "(错误),要么是"5 cents"(错误x 2)......应该是:

25 cents

我几乎尝试了所有方法,转义变量,将它们放在引号中,但没有运气。显然有一种我不知道的正确方法来处理这个问题,所以任何帮助都很好 - 谢谢。

【问题讨论】:

  • 我不明白。您能否在没有 onetwo 变量的情况下给出示例(仅使用数字),这样我就可以看到您要对转义序列做什么?
  • @Jack:当然,printf "\x31,2<String>\x30"...所以发生的情况是<String>(25 美分)前面或后面的任何数字都会导致转义/控制代码出现问题(@987654331 @ 将变为 \x31,225 cents ...)。
  • 我认为您需要重新阅读 ansi 颜色代码序列。数字后面有一个m,序列由ESC [引入(如\x1b[31,2m)。
  • 不够清楚但您应该使用echo 而不是printf。因为当您使用%sprintf 时,您当然必须用空格分隔字符串,然后将其传递给printf
  • 请说明输出应该是25 cents 还是225 cents

标签: bash shell printf


【解决方案1】:

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

  1. Gnu printf 解释的 C 样式十六进制转义格式为 \x 后跟 两个 十六进制数字。 (您可以只使用一个数字,但前提是下一个字符不是十六进制数字。因此最好将其视为始终为两个数字。)控制-C(字符代码 3)写为\x03x30\x39 是数字 09 的字符代码。转义码的翻译是由 printf 完成的,而不是由 shell 完成的,所以首先进行参数替换。所以如果$one的值为1,printf "\x3${one}"会被shell扩展为printf "\x31",然后printf会打印出数字1。我认为这不是您想要的,因为插入变量值的迂回方法显然要少得多,这不会将变量限制为单个十进制数字。

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

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

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

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

所以更好的printf 调用可能是:

printf "\003%02d,%02d%s\003" "$one" "$two" "$str"

注意:当然,我对您要生成的字符串的猜测可能完全错误。这只是基于未删除的临时评论的猜测。如果是这样,并且如果您认真考虑回答您的问题,我强烈建议您更清楚地解释您正在尝试使用 printf 语句生成的字节字符串。

【讨论】:

    猜你喜欢
    • 2021-08-02
    • 2023-03-15
    • 1970-01-01
    • 2014-09-16
    • 1970-01-01
    • 2012-04-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多