我试图简单地读入一个文件,查找该文件中的特定行。我对 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 做什么。