首页 文章

bash脚本中的Echo选项卡字符

提问于
浏览
247

如何使用bash脚本回显一个或多个制表符?当我运行此代码时

res='       'x # res = "\t\tx"
echo '['$res']' # expect [\t\tx]

我明白了

res=[ x] # that is [<space>x]

10 回答

  • 62
    res="\t\tx"
    echo -e "[${res}]"
    
  • 7
    echo -e ' \t '
    

    将回显'space tab space newline'( -e 表示'enable interpretation of backslash escapes'):

    $ echo -e ' \t ' | hexdump -C
    00000000  20 09 20 0a                                       | . .|
    
  • 17

    使用 printf ,而不是 echo .

    echo 命令有多个不同版本 . 有 /bin/echo (可能是也可能不是GNU Coreutils版本,具体取决于系统), echo 命令内置于大多数shell中 . 不同的版本有不同的方式(或没有办法)来指定或禁用控制字符的转义 .

    另一方面, printf 的变化要小得多 . 它可以作为命令存在,通常是 /bin/printf ,而's built into some shells (bash and zsh have it, tcsh and ksh don't),但各种版本比 echo 的不同版本更相似 . 并且您不必记住命令行选项(除了少数例外; GNU Coreutils printf接受 --version--help ,内置bash printf接受 -v var 将输出存储在变量中) .

    对于你的例子:

    res='           'x # res = "\t\tx"
    printf '%s\n' "[$res]"
    

    现在是时候让我承认 echo 对于你所询问的例子也会起作用;你只需要在参数周围加上双引号:

    echo "[$res]"
    

    正如kmkaplan写的那样(两年半前,我刚才注意到了!) . 原始命令的问题:

    res='           'x # res = "\t\tx"
    echo '['$res']' # expect [\t\tx]
    

    不是 echo ;它是在 echo 看到它之前用一个空格替换了标签 .

    echo 对于简单输出很好,例如 echo hello world ,但是每当你想做更复杂的事情时你都应该使用 printf . 您可以使 echo 工作,但是当您使用不同的 echo 实现或不同的shell运行它时,生成的代码可能会失败 .

  • 11

    把你的字符串放在 double 引号之间:

    echo "[$res]"
    
  • 405

    你也可以尝试:

    echo Hello$'\t'world.
    
  • 2

    你需要使用-e标志来回声

    echo -e "\t\t x"
    
  • 11

    使用echo来打印变量值是一个常见的Bash陷阱 . 参考链接:

    http://mywiki.wooledge.org/BashPitfalls#echo_.24foo

  • 26

    从bash手册页:

    $'string'形式的单词被特别处理 . 单词扩展为字符串,替换为ANSI C标准指定的反斜杠转义字符 .

    所以你可以这样做:

    echo $'hello\tworld'
    
  • 0

    使用逐字击键, ^VCTRL+VC-v ,等等) .

    当您在终端(或大多数Unix编辑器)中键入 ^V 时,将逐字记录以下字符 . 您可以使用它在您回显的字符串中键入文字制表符 .

    类似下面的工作:

    echo "^V<tab>"     # CTRL+V, TAB
    

    Bash docs(q.v.,"quoted-insert")

    quoted-insert(C-q,C-v)将您键入的下一个字符逐字添加到该行 . 例如,这是如何插入像C-q这样的关键序列 .

    旁注:根据这个, ALT+TAB 应该做同样的事情,但我们've all bound that sequence to window switching so we can'吨用它

    tab-insert(M-TAB)插入制表符 .

    注意:您可以将此策略与各种不寻常的字符一起使用 . 像回车一样:

    echo "^V^M"        # CTRL+V, CTRL+M
    

    这是因为回车符是ASCII 13, M 是字母表的第13个字母,因此当您键入 ^M 时,您将获得第13个ASCII字符 . 您可以使用 ls^M 在空的提示符下查看它的运行情况,该提示符将插入一个回车符,导致提示符就像您点击返回一样 . 当这些字符被正常解释时,逐字逐句可以获得文字字符 .

  • 32

    如果要在脚本中使用 echo "a\tb" ,则将脚本运行为:

    # sh -e myscript.sh
    

    或者,您可以向myscript.sh提供执行权限,然后运行该脚本 .

    # chmod +x myscript.sh
    # ./myscript.sh
    

相关问题