シェルスクリプトで比較すると、特殊文字を無視します。

シェルスクリプトで比較すると、特殊文字を無視します。

私のスクリプトで一時変数を比較していますが、空の場合は一時変数を更新したいと思います。しかし、以下のスクリプトは機能しません。

スクリプト:

temp=`head -5 $filename1 | tail -1`
if [ "$temp" == " " ]
then
    temp=`head -6 $filename1 | tail -1`
    echo "Blank - Updated temp value"
else
    echo "$temp not blank"
fi

トラブルシューティング後にodコマンドを使用したときにこれが見つかりました。一時変数を確認してみると空白があることを考慮せず、特殊文字が入っています。

echo $temp | od -c
0000000  \r  \n
0000002

上記の特殊文字を無視する方法を理解できますか?

答え1

最初にすべきことは次のとおりです。

if [ "$temp" == " " ]

比較演算子は実際で=はありません==。後者は一部のシェルで動作しますが、標準ではありません。また、変数を空の文字列と比較する代わりに、変数を単一のスペースを含む文字列(ファイルに含めることも含まれない場合もあります)と比較します。

ファイルに追加のスペースを含めることができる場合は、すべてのsedスペースを使用または削除することをお勧めしますtr。その後、それを使用して空で[ -z "$temp" ]あることをテストできます。だから:

temp=$(head -5 $filename | tail -1 | tr -d ' \t\r')
if [ -z "$temp" ] ; then ...

headと を使用して行を選択できます。tailsed

temp=$(sed -n '5p' | tr -d ' \t\r')
if [ -z "$temp" ] ; then ...

5p「ライン5から(p)このラインを印刷」を意味し、-nすべてのラインを印刷するデフォルトのジョブを無効にします。)


awk実際にテストするのではなく、5行目に内容があるかどうかに応じてファイルを繰り返して5行目または6行目を取得するスクリプトがあります。

temp=$(tr -d ' \t\r' < $filename1 | awk '(NR==5 && $0) || NR==6 {print; exit}' )

NR==5現在の行(レコード)番号をテストし、行$0の内容に展開され、行が空でない場合は「true」&&||一般的な場合です。そしてそしてまたは操作)

答え2

sedすべての空白文字を使用して削除します。temp=$(head -5 $filename1 | tail -1 | sed -r 's/\s+//g')

関連情報