トップページ > Linux > 2019年10月31日 > hpOp+iT/

書き込み順位&時間帯一覧

1 位/129 ID中時間01234567891011121314151617181920212223Total
書き込み数1500000000000000000000006



使用した名前一覧書き込んだスレッド一覧
login:Penguin
くだらねえ質問はここに書き込め! Part 238

書き込みレス一覧

くだらねえ質問はここに書き込め! 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


※このページは、『2ちゃんねる』の書き込みを基に自動生成したものです。オリジナルはリンク先の2ちゃんねるの書き込みです。
※このサイトでオリジナルの書き込みについては対応できません。
※何か問題のある場合はメールをしてください。対応します。