ダッシュ:文字列を2つの変数に解析します。

ダッシュ:文字列を2つの変数に解析します。

解析する必要があるダッシュスクリプトがあります。これは、「」で区切られた2つの部分を含む文字列$1です。たとえば、$Xと$Yに保存したいと思います。:foo:123foo123

私は次のことができると思いますread

$ echo "foo:123" | tr ':' ' ' | read X Y

ただし、これは機能しません(エラーは発生しません)。

$ echo $X

空行を出力として提供します。

私のread設定がうまくいかないのはなぜですか?目標を達成するにはどうすればよいですか?(すべてのソリューション、読み取りを使用する必要はありません)

答え1

存在するスプリント、各コマンド管路 サブシェルで実行zshそしてAT&T kshパイプラインの一番右のコマンドは)、したがってコマンドが完了すると、変数XYもはや存在しません。

簡単に言えば、使えますパラメータ拡張、努力する:

$ 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パイプのすべての部分はサブシェルで実行されます(同時に実行されるため、とにかく別のプロセスで実行する必要があります)。上記では、これを使用する部分を、 の出力を読み取るサブシェルに入れる必要があります。bashkshzsh$Xprintfセット $X

$1改行や複数の文字が含まれている場合、両方の:ソリューションは異なる動作をします。

関連情報