- くだらねえ質問はここに書き込め! Part 238
210 :login:Penguin[sage]:2019/10/31(木) 00:56:01.59 ID:hpOp+iT/ - >>209
配列なんか使うな。それはbashの拡張だ。 POSIXシェルには配列などというものはない。 外部コマンドの呼び出しなんだからそれはbashスクリプトの外の話だ bash専用機能である配列は使えない
| - くだらねえ質問はここに書き込め! Part 238
211 :login:Penguin[sage]:2019/10/31(木) 01:02:37.89 ID:hpOp+iT/ - そもそもシェルというものをわかっていない。
一般的な言語の関数は、引数で情報を与え、戻り値で情報をもらうものだが シェルというのは情報の入出力を標準入出力で行うものだ。 そしてシェルでは標準入出力の一行が一データ、複数のデータは複数の行数で表すのが基本だ 引数はこういうやり方もあるよという別解だと考えたほうがいい echo -e "A B C\nD E F\nG H I" | awk '{printf "\"%s %s %s\"\n", $3, $2, $1}' ↑つまりはこれが正しいということだ。 だからお前がやるべきことはそのbash依存した配列を 複数行のデータに変換することだ
| - くだらねえ質問はここに書き込め! Part 238
212 :login:Penguin[sage]:2019/10/31(木) 01:07:04.68 ID:hpOp+iT/ - >>209
話の前に、echo -e はやめとけ。それはbash依存だ。 エスケープシーケンスを使うならprintfを使ったほうがいい 簡単になおせる printf '%s\n' "A B C" "D E F" "G H I" | awk '{printf "\"%s %s %s\"\n", $3, $2, $1}' そしてbashの配列の代わりに位置パラメータを使えばいい set -- "A B C" "D E F" "G H I" printf '%s\n' "$@" | awk '{printf "\"%s %s %s\"\n", $3, $2, $1}'
| - くだらねえ質問はここに書き込め! Part 238
213 :login:Penguin[sage]:2019/10/31(木) 01:10:51.96 ID:hpOp+iT/ - どうしてもbashの配列を使いたいというのならこうだ。
declare -a array=( "A B C" "C D E" "F G H" ) printf '%s\n' "${array[@]}" | awk '{printf "\"%s %s %s\"\n", $3, $2, $1}' 考え方は位置パラメータ $@ を使うのと同じだ。 $@ の代わりに ${array[@]} になっただけだ。 言い換えると位置パラメータを複数使えるようになったのがbashの配列だ
| - くだらねえ質問はここに書き込め! Part 238
216 :login:Penguin[sage]:2019/10/31(木) 01:19:51.44 ID:hpOp+iT/ - readarrayもbashの拡張だ。そういうものは使わない
シェルスクリプトはパイプで処理をつなげていくものだ declare -a array=( "A B C" "C D E" "F G H" ) printf '%s\n' "${array[@]}" | awk '{printf "\"%s %s %s\"\n", $3, $2, $1}' | while read -r line; do echo "$line" # $lineの加工処理とかなにか done こうすることで、出力とawkの加工と自前のreadの処理が並列で動く readarrayなどを使ってしまったら、一旦bashの配列に入れてしまうから 並列で動かなくなる。つまり遅くなる。 | while read はパイプでサブシェルになってしまって動かないから例も置いとく printf '%s\n' "${array[@]}" | awk '{printf "\"%s %s %s\"\n", $3, $2, $1}' | { i=0 while read -r line; do i=$((i + 1)) echo "$line" # $lineの加工処理とかなにか done echo "合計行数 $i" }
| - くだらねえ質問はここに書き込め! Part 238
217 :login:Penguin[sage]:2019/10/31(木) 01:20:57.62 ID:hpOp+iT/ - >>216のように書くよりも関数にしたほうが分かりやすいがな
func() { i=0 while read -r line; do i=$((i + 1)) echo "$line" # $lineの加工処理とかなにか done echo "合計行数 $i" } set -- "A B C" "D E F" "G H I" printf '%s\n' "$@" | awk '{printf "\"%s %s %s\"\n", $3, $2, $1}' | func
|
|