シェルスクリプトで変数に空の値を取得するには? [閉鎖]

シェルスクリプトで変数に空の値を取得するには? [閉鎖]

grepファイルを検索するには、コマンドに2つの変数を使用しました。ユーザーが1つを入力して2番目の変数でEnterキーを押すと、エラーが発生します。

ユーザーが2番目の変数に何も入力しない場合は、2番目の変数にNULL値を設定したいと思います。

#!/bin/bash 
find /var/log/nginx/ -type f ( -iname "access.log*" ! -iname "access.log*.gz" ) -exec cat {} + >> output.txt 
echo enter the file name read file1 
echo "enter varible 1" 
read var1 
echo "enter varible 2" 
read var2 
grep -w $var1 output.txt | grep $var2 | cut -d' ' -f1,4,12,25 > $file1 
grep -w $var1 output.txt | grep $var2 |sed 's#.*(aff_id=[[:digit:]]\+).*(off_id=[[:digit:]]‌​\+).*(trans_‌​id=[[:alnum:]]\+)‌​;.*#\1 \2 \3#' > out2.txt 
paste -d' ' $file1 out2.txt > out3.txt 
rm -rf output.txt 
rm -rf $file1

答え1

あなたが探しているのは、変数に値が割り当てられているかどうかをテストする機能のようです。これは、Bash文字列比較演算子を使用して実行できます。これらの演算子は、次のようないくつかの共通参照に文書化されています。

特に、以下を使用してif [ -n "${string}" ]空でない文字列をテストできます。このテストを使用するようにスクリプトを調整すると、次のような結果が表示されることがあります。

#!/bin/bash
find /var/log/nginx/ -type f ( -iname "access.log*" ! -iname "access.log*.gz" ) -exec cat {} + >> output.txt
echo enter the file name read file1
echo "enter varible 1"
read var1
echo "enter varible 2"
read var2

if [[ -n "${var2}" ]]; then var2=""; fi

grep -w $var1 output.txt | grep $var2 | cut -d' ' -f1,4,12,25 > $file1
grep -w $var1 output.txt | grep $var2 | sed 's#.*(aff_id=[[:digit:]]\+).*(off_id=[[:digit:]]‌​\+).*(trans_‌​id=[[:alnum:]]\+)‌​;.*#\1 \2 \3#' > out2.txt

paste -d' ' $file1 out2.txt > out3.txt
rm -rf output.txt
rm -rf $file1

つまり、これがトラブルシューティングに役立つとは思わない。エラーを防ぐには、変数を引用するだけでgrep十分です(例:)grep -w "${var1}" output.txt。引用変数を使用するスクリプトは次のとおりです。

#!/bin/bash
find /var/log/nginx/ -type f ( -iname "access.log*" ! -iname "access.log*.gz" ) -exec cat {} + >> output.txt
echo enter the file name read file1
echo "enter varible 1"
read var1
echo "enter varible 2"
read var2

if [[ -n "${var2}" ]];
    var2=""
fi

grep -w "${var1}" output.txt | grep "${var2}" | cut -d' ' -f1,4,12,25 > $file1
grep -w "${var1}" output.txt | grep "${var2}" | sed 's#.*(aff_id=[[:digit:]]\+).*(off_id=[[:digit:]]‌​\+).*(trans_‌​id=[[:alnum:]]\+)‌​;.*#\1 \2 \3#' > out2.txt

paste -d' ' $file1 out2.txt > out3.txt
rm -rf output.txt
rm -rf $file1

grep式で変数を参照する必要がある理由の説明は、次のとおりです。Bash初心者ガイド:セクション3.4.8 - トークン化:

シェルは、単語分割のために二重引用符内に表示されない引数拡張、コマンド置換、および算術拡張の結果をスキャンします。 [...] 明示的な null 引数 ("""" または "''")) は保持されます。値のないパラメータ拡張により、暗黙的に引用されていないNULLパラメータは削除されます。値のないパラメータを二重引用符で拡張すると、空のパラメータが生成され保持されます。

関連情報