ksh88でHere-Stringsを使用できますか?

ksh88でHere-Stringsを使用できますか?

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、、mkshGNU 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つの要素に分割されても止まらないということだけです。したがって、$linefoo 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開発者です。

おすすめ記事