【问题标题】:Variables overwriting text problem with "echo" in Bash变量在 Bash 中用“echo”覆盖文本问题
【发布时间】:2010-12-10 18:36:14
【问题描述】:

我使用 OS X 10.6.5,Bash。

当我运行这个时:

echo $IP; echo of; echo $IPLINES

我得到这个输出:

219.80.4.150:3128
of
1108

当我运行这个时:

echo $IP of $IPLINES

我得到这个输出:

 of 1108.150:3128

我希望得到:

219.80.4.150:3128 of 1108

什么会导致我得到的输出失真?

实际的脚本是这样的:

#!/bin/bash

IPLINES=`cat a.txt | wc -l | awk '{print $1}'`

if [ $IPLINES > 1 ]; then
    LINE=`expr $RANDOM % $IPLINES + 1`
    IP=`head -$LINE a.txt | tail -1`
    sed -e "${LINE}d" -i .b a.txt

    echo $IP of $IPLINES
fi

【问题讨论】:

    标签: macos bash echo


    【解决方案1】:

    这里有一个疯狂的猜测:您正在从 .txt 文件中提取 IP 变量——如果这是一个 Windows 文件,或者是 Windows 风格的编码,则行以 \r\n 结尾。你把换行符拿走了,但如果里面有一个\r 让你回到行首呢?

    不问任何问题的快速脏修复:使用echo -n,它会在回显文本的末尾抑制换行符。

    echo -n $IP; echo -n of; echo -n $IPLINES
    

    如果问题仍然存在,可能就是我上面所说的。尝试右修剪$IP

    编辑:没有看到 OSX 部分,抱歉。在 OSX 中,行以 \r 结尾——这一定是问题所在。

    【讨论】:

    • 对,对。我更改了文件中的行尾,问题解决了。感谢 -n,我不熟悉那个标志。
    • 实际上在 OS X 中,行通常不要以 \r 结尾。您通常只能在经典 Mac OS 时代的旧旧应用程序的文件中看到这一点。
    • 您也可以使用tr删除不需要的字符:cleanline="$(echo $line | tr -d '\r')"
    • echo -n 是错误的形式 - 请参阅 POSIX spec for echo 将其行为指定为未定义,并且 - 在 APPLICATION USAGE 部分 - 建议改用 printf。 (即printf '%s' "$foo" 代替echo -n "$foo",或printf '%b' "$foo" 代替echo -ne "$foo")。
    【解决方案2】:

    $IP 的末尾似乎有一个回车符 (\r)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-09-30
      • 2018-06-15
      • 2012-01-12
      • 2015-01-01
      • 2011-06-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多