私のスクリプトで一時変数を比較していますが、空の場合は一時変数を更新したいと思います。しかし、以下のスクリプトは機能しません。
スクリプト:
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
と を使用して行を選択できます。tail
sed
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')