次のスクリプトがあります。私は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
使用しないと仮定すると、スクリプトのパイプラインの最後の部分がサブシェルで実行されるため、現在のシェルの代わりにそのサブシェルが終了します。zsh
ksh
exit
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
テキストが属するロケールに変更します。