解析する必要があるダッシュスクリプトがあります。これは、「」で区切られた2つの部分を含む文字列$1
です。たとえば、$Xと$Yに保存したいと思います。:
foo:123
foo
123
私は次のことができると思いますread
。
$ echo "foo:123" | tr ':' ' ' | read X Y
ただし、これは機能しません(エラーは発生しません)。
$ echo $X
空行を出力として提供します。
私のread
設定がうまくいかないのはなぜですか?目標を達成するにはどうすればよいですか?(すべてのソリューション、読み取りを使用する必要はありません)
答え1
存在するスプリント、各コマンド管路 サブシェルで実行(zsh
そしてAT&T ksh
、パイプラインの一番右のコマンドは)、したがってコマンドが完了すると、変数X
とY
もはや存在しません。
簡単に言えば、使えますパラメータ拡張、努力する:
$ set -- foo:123
$ X=${1%:*}
$ Y=${1#*:}
この例は対話型セッションに関するものです。
スクリプトには必要ありませんset -- foo:123
。
答え2
また、使用することができます分割+グローバル演算子(変数の引用を解除)(そして質問に明白な理由なしに変数を使用しています):
IFS=: # configure the split part to use : as the delimiter
set -f # disable the glob part
set -- $1 # $1 is split on : and parts are stored in $1, $2...
X=$1 Y=$2
次のようにすることもできます。
printf '%s\n' "$1" | {
IFS=: read -r X Y
printf '%s\n' "$X"
}
AT&Tやその逆の場合と同様に、dash
パイプのすべての部分はサブシェルで実行されます(同時に実行されるため、とにかく別のプロセスで実行する必要があります)。上記では、これを使用する部分を、 の出力を読み取るサブシェルに入れる必要があります。bash
ksh
zsh
$X
printf
セット $X
。
$1
改行や複数の文字が含まれている場合、両方の:
ソリューションは異なる動作をします。