終了コマンドがネストされたwhileループを終了しないのはなぜですか? [コピー]

終了コマンドがネストされたwhileループを終了しないのはなぜですか? [コピー]

次のスクリプトがあります。私はpasswdの最初の文字をすべてコンソールに印刷しますが、私の期待は1文字だけをインポートしてからプログラムが終了することです。

#!/bin/sh 

cat /etc/passwd |
while read -r line
do
    echo ${line} |
        grep -o . |
        while read char
        do
            echo ${char}   
            exit 1       
        done
done

実際の出力:

r
b
d
a
(etc)

予想出力:

r

ベストアンサー1

パイプラインの各部分を除いて、Bourneなどのほとんどのシェルはサブシェルzshで実行されます。 orをksh使用しないと仮定すると、スクリプトのパイプラインの最後の部分がサブシェルで実行されるため、現在のシェルの代わりにそのサブシェルが終了します。zshkshexit

zshまたはで希望の出力を取得できますksh

それにもかかわらず、このコードには多くの欠陥があります。


必要なものがファイルの最初の文字を取得する場合は、次のようにします。

dd bs=1 count=1 if=/etc/passwd 2>/dev/null

またはGNUを使用してくださいdd

dd status=none bs=1 count=1 if=/etc/passwd

ASCII文字でのみ機能します。マルチバイト文字の場合:

LC_ALL=en_US.utf8 awk '{print substr($0,1,1);exit}'

LC_ALLテキストが属するロケールに変更します。

おすすめ記事