当用双引号括起来时,读取行变量返回空白

当用双引号括起来时,读取行变量返回空白

我试图简单地读入一个文件,查找该文件中的特定行。我对 bash 有点陌生。下面是一个简化版本:

removeIgnoreEntry() {
    start=0
    while read line; do

        echo "$line"

        if [ "$line" = "ignore_profiles" ]; then 
            echo "Profile Start"
            start=1
        elif [ "$start" = 1 ]; then 
            if [ "$line" = "$1" ]; then 
                echo "Line found!"
            fi 
        fi 
    done < "$FILE" 
}

奇怪的行为是第四行 ( echo "$line"),其中echo不向控制台显示任何内容。但是,如果我在 之前添加一些字符$line,它会显示得很好(例如echo "My line: $line")。

我不知道为什么,我相信这就是为什么if后面的语句echo无法识别何时找到带有 的行ignore_profiles

我无法在任何地方找到有关此内容的信息,可能是因为我没有正确的关键字。

感谢您的时间。

答案1

您的输入文件是否包含任何echo可以解释为选项的内容?喜欢-n

尝试printf "%s\n" "$line"代替echo "$line".

另外,使用read -r而不只是read.

顺便说一句,你的整个 while 循环可以用这样的东西替换,在你的 shell 函数中使用 awk :

removeIgnoreEntry() {

  awk -v search="$1" '{print}
      /^ignore_profiles$/ { start=1; print "Profile Start" };
      start == 1 && $0 == search { print "Line Found!" }' "$FILE"
}

如果您需要使用 ,则可以从 awk 脚本返回 start END { exit start },这将根据 awk 的 start 变量的值返回退出代码 0 或 1。

removeIgnoreEntry() {

  awk -v search="$1" '{print}
      /^ignore_profiles$/ { start=1; print "Profile Start" };
      start == 1 && $0 == search { print "Line Found!" }
      END {exit start}' "$FILE"

  start=$?    # get the exit code of the awk script into sh's $start variable.
}

我不完全确定其中任何一个是否正是您想要的,主要是因为我无法弄清楚您想要用嵌套的 ifs 和 elif 做什么。

相关内容