2016-12-27 20 views
0

おはよう。IF文を実行しようとしているシェルのエラー

特定のファイルの各行を読み取って、その行に含まれる文字の数に応じて各行を2番目のファイルに送信するスクリプトを作成しようとしています。例えば

私は、以下の情報が含まれている数字と呼ばれるファイルがあります:あなたは私がしようとしていた、それぞれに8つのまたは9の数字で番号を持って見ることができるように

numbers.txt

5196803638 
31995500317 
5196396080 
51999205240 
5198158891 

をファイル行を読み込んで各番号を特定のファイルに送信するスクリプトを作成します。

!#/bin/bash 

while IFS='' read -r line || [[ -n "$line" ]]; do 

    echo $line 

if [ "${#line}"= 8 ]; then 
    $line> file8.txt 
elif [ "${#line}"= 9 ]; then 
    $line> file9.txt 
else 
    echo "Error" 
fi 

done < "$1" 

しかし、私が得る唯一のものは、以下の

51996803638 
My.sh: line 7: [: 11=: unary operator expected 
My.sh: line 9: [: 11=: unary operator expected 
Error 
+2

http://shellcheck.net/このエラーは自動的に発生します。 –

+0

ところで、ループ内でファイル名でリダイレクトするのは非常に効率が悪いです。つまり、8文字の行が表示されるたびに 'file8.txt'を再オープンし、9行目を見るたびに' file9.txt'を再度開きます。 -character lineなどです。ループ外で出力ファイルを開き、複数の書き込みでファイル記述子を再利用する必要があります。 –

答えて

1

シェルのトークナイザでは空白に敏感です。

if [ "${#line}" = 8 ]; then 
    $line> file8.txt 
elif [ "${#line}" = 9 ]; then 
    $line> file9.txt 
else 
    echo "Error" 
fi 

のように、=の前後にスペースを使用するか、私は拡張/保守性/より読み見つけたこの約:

case ${#line} in 
    (8) $line > file8.txt;; 
    (9) $line > file9.txt;; 
    (*) echo Error;; 
esac 
+0

My.sh:行9:[:11 =:単項演算子の期待部分ですが、私はまだ "エラー"部分を取得しています。ファイルに送信していないか、ifステートメント。 –

+0

@ Otorrinolaringologista-manどのような文字列を入力しますか?あなたは '$ {#line}'が '$ line'の文字数を得ていることを知っていますか?また、 'echo $ line >> file8.txt'と書くのではありませんか?表示されている入力ファイルには、8文字または9文字の数字は含まれていないことに注意してください。 – Jens

+0

私は 'done 8> file8.txt 9> file9.txt'を使って' echo "$ line">&8'と 'echo" $ line ">&9'を強く考えています。ファイルは1行に収められていますが、正しいとは思えません。 (そして、明らかに与えられたサンプル行はデータであり、コマンドではなく、明示的な 'echo'、' printf '%s \ n''などが必要です)。 –

2

あなたの番号が10個のまたは11文字を持っています。数値を比較するときは、-eq,-ne,-lt,-gt,-le,-geを使用してください。

while IFS='' read -r line || [[ -n "$line" ]]; do 
    echo $line 
    echo "Length = ${#line}" 
    if [ ${#line} -eq 10 ]; then 
     echo $line >> file10.txt 
    elif [ ${#line} -eq 11 ]; then 
     echo $line >> file11.txt 
    else 
     echo "Error" 
    fi 
done < "$1" 
+1

このようにループ内で '' file10.txt'を使うのは非常に非効率です。 '10> file10を実行した場合。txt' *外部*ループの中に入れて、ループの中に '>&10' *を入れると、一行を書きたい時にいつでもファイルを一度書き直すのではなく、 1行書いた後にもう一度。 –

+1

ところで、あなたは一束の引用符を紛失しています - 今は 'line = '*''があれば、現在のディレクトリにファイルのリストをエコーし​​ます。 –

関連する問題