行変数を読み込んで二重引用符で囲むと、空白が返されます。

行変数を読み込んで二重引用符で囲むと、空白が返されます。

私は単にファイルを読み、ファイル内の特定の行を見つけようとします。私は初めて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で何をしたいのかわからないからです。

おすすめ記事