私は単にファイルを読み、ファイル内の特定の行を見つけようとします。私は初めて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"
}
奇妙な動作は、コンソールに何も表示しない4行目(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ループは、シェル関数で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の開始変数の値に応じて終了コード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.
}
これがまさにあなたが望むものであるかどうかは完全にはわかりません。主にネストされたifとelifで何をしたいのかわからないからです。