115:wc -l:find . -iname "*test*":find /tmp/ -iname "*test*"
上記の文字列を解析したいと思います。
私の場合、文字列は4つの列(:
各コマンドの区切り文字を含む)で構成されていますが、長くすることもできます。で始まり、...常に区切り文字なしで115
続く初期番号を含むすべてのコマンドを「プール」したいと思います。wc -l, -iname "*test*"
find /tmp/ -iname "*test*"
:
私の変数は$var
次の値を取得する必要があります。
var= 115 , var= wc-l , var= find . -iname "*test*" , var= find /tmp/ -iname "*test*"
私のコード:
while read line;
do
while [[ $var -ne '0' ]];
do
var=$( echo $line | cut -d ':' -f$i )
i=$( expr $i + 1 )
echo $var
done
done <$1
ファイルから行を読み取り、列を空の列に切り捨てるときは、2番目の行を使用します。明らかに何か間違っているようです。エコーが何も印刷しないからです。
ベストアンサー1
私の考えにうまくいくと思うように動作するように変更されたスクリプトは次のとおりです。
i=1
while read line;
do
while :; do
var=$( echo $line | cut -d ':' -f$i )
i=$( expr $i + 1 )
[[ "$var" != "" ]] || break
echo $var
done
done <$1
いくつかの注意:
i
初期化されていないvar
初期化もないので、内部ループは一度も実行されません。- 何をテストするのかわかりませんが、空の文字列と比較する方が良いと
[[ $var -ne '0' ]]
思います。$var
- したがって、空のフィールド(たとえば、2つの連続コロン)がある場合、スクリプトはそこで終了します。
同じことを行うより安定した方法は次のとおりです。
while read line; do
num_fields=$(echo $line|awk -F':' '{print NF}')
for (( i=1; i <= num_fields; i++ )); do
var=$( echo $line | cut -d ':' -f$i )
echo $var
done
done <$1