【问题标题】:Echo -n With String argument printing the "-n" part, even though not within quotation marksEcho -n 使用字符串参数打印“-n”部分,即使不在引号内
【发布时间】:2016-03-01 00:43:40
【问题描述】:

我一直在学习如何在 bash 中编写脚本,但遇到了一个令人沮丧的错误。在下面的代码中,它只运行打印 10 行和 10 列,每次运行 echo -n "$j " 时,输出都会打印出一个新行和 echo 命令的“-n”参数。

echo 命令和 echo -n 本身都可以正常工作,但由于某种原因,请不要在此脚本中工作...提前谢谢您

    #Nested for loop

    for i in 1 2 3 4 5 6 7 8 9 10
    do
    echo -n "Row $i: "

    for j in 1 2 3 4 5 6 7 8 9 10
    do
            sleep 1
            echo -n "$j  "
    done

    echo #Outputs new line
    done

输出看起来像这样......

-n Row 1

-n 1

-n 2 ...等等

【问题讨论】:

  • echo 有多种不同的实现方式:shell 内置命令(每个 shell 可能不同)和 /bin/echo。有些认得-n;其他人没有。考虑改用printf 命令;它在不同的实现中更加一致。同时,您的脚本顶部是否有 #! 行,如果有,它是什么样的,以及您执行脚本的具体情况如何?
  • 尝试在两个 echo 语句中使用单引号而不是双引号。
  • @arif,完全错误的建议:单引号防止变量扩展。

标签: bash echo


【解决方案1】:

echo 的某些实现将-n 解释为“不要在末尾添加换行符”,但其他实现只是将其视为要打印的字符串的一部分。它甚至可以在同一实现的不同版本之间有所不同!根据Single Unix Specification description of echo,“除非-n(作为第一个参数)和转义序列都被省略,否则不可能在所有POSIX系统中使用可移植的echo。”

IIRC,一个版本的 OS X(可能是 10.5.0?)附带的 bash 版本将 -n 视为要打印的字符串的一部分,我的一堆脚本坏了。

所以我学会了改用printf。它比echo 稍微复杂一些,但更便携和可预测。棘手的是第一个参数是一个格式字符串,它说明如何打印其余参数。要替换标准的echo "somestring" 命令,您可以使用printf "%s\n" "somestring"。对于echo -n "somestring",只需将\n 留在格式字符串之外:printf "%s" "somestring"。所以在你的情况下:

printf "%s" "$j  "

【讨论】:

    【解决方案2】:

    我刚刚在我的系统上测试了您的代码,它似乎在 bash 中可以正常工作。但是,当我在直接 sh 中运行它时,我确实得到了您描述的确切错误。假设您在 Mac 上运行它,请在运行脚本之前尝试运行 /bin/bash

    假设您的脚本在一个文件中,您还可以添加#!/bin/bash 作为脚本的第一行(这告诉计算机使用 bash 执行它)。

    【讨论】:

    • 非常感谢!我尝试重新启动 bash,但即便如此(以及添加 #!/bin/bash,程序似乎仍然有轻微错误。我将使用其他人的建议并学习 printf(),但无论如何感谢你建议。
    猜你喜欢
    • 2012-06-26
    • 1970-01-01
    • 2012-11-24
    • 2014-04-24
    • 2012-01-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多