kshスクリプトの3つの変数のうちの1つから3つの単語を抽出したいと思います。 ksh93でこの行を使用しましたが、うまく動作します。
read A B C <<< $line
ksh88で上記のコマンドを実行すると、次のエラーが発生します。
syntax error at line ## : '<' unexpected
ksh88で同じことをどのように実行できますか?
ベストアンサー1
ksh88
いいえ、ここの文字列はおよびで使用できませんpdksh
。ただし、最新ksh93
(オリジナルのAT&T Korn Shell)および(mksh
現在活発に開発されているpdksh
スピンオフ)で利用可能です。
<<<
はいksh93
、、mksh
GNU bash
、およびzsh
。
あなたの具体的な質問...
read A B C <<< $line
...この問題を解決できます(Kornシェル)。
print -r -- $line |&
read -p A B C
これを使用することもできますが(POSIXシェル)、tmpfileのパフォーマンスが低下します(一方である可能性<<<
があります)。
read A B C <<EOF
$line
EOF
しかし、単語を分離したい場合は、次のようにします。
set -A arrname -- $line
${arrname[0]}
その後、代わりに使用し$A
て${arrname[1]}
交換してください$B
。 3つの要素に分割されても止まらないということだけです。したがって、$line
「foo bar baz bla
」の場合は$C
「baz bla」が含まれ、${arrname[2]}
「baz」がある場合は${arrname[3]}
「bla」が含まれます。
ただし、位置パラメーターが不要な場合は、次のことができます。
set -- $line
A=$1; shift
B=$1; shift
C=$*
ただし、単語数が3個未満の場合はエラーが発生します(不明な場合は確認するかshift
(潜在的に遅い)確認を最初に使用してください)。$line
$#
[[ $line = *' '*' '[! ] ]]
これはset … $line
ワイルドカードも行います(上記のStéphaneに感謝します)、以前に必要ですset -o noglob
(通常は後で以前の状態を復元できますset +o noglob
)。
完全な公開:私はmksh
開発者です。