下記の処理、Bashスクリプト化できますか?


下記スクリプト、Bashスクリプトではどう書くのでしょうか?

<?php
$arr = array('a'=>'A', 'b'=>'B');
foreach ($arr as $k => $v) {
echo "$k => $v".PHP_EOL;
}

回答の条件
  • 1人2回まで
  • 登録:
  • 終了:2009/09/16 15:25:06
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:y-kawaz No.1

回答回数1422ベストアンサー獲得回数226

ポイント100pt

こんな感じですか?

#!/bin/sh
arr=("a=>A" "b=>B")        #1
for kv in "${arr[@]}"; do  #2
    k="${kv%=>*}"          #3
    v="${kv#*=>}"          #4
    echo "${k} => ${v}"    #5
done

一応解説

  1. arrという配列変数に二つの文字列を代入しています。
    • これは arr[0]="a=>A" と arr[1]="b=>B" を1行で行う書式です。
  2. 配列の値をループで回します。
    • arr内の各値は変数 kv に入ります。
    • 配列変数の値は通常は ${arr[0]} や ${arr[1]} でアクセスできますが、${arr[@]} は配列内の全ての値を半角スペース区切りで取得する書式?です。
    • ${arr[@]} ではなく "${arr[@]}" としているのは値に空白が含まれている場合を想定しています。
      • arr=(a "b c") の場合、${arr[@]} は a b c という3つの引数に展開されますが、"${arr[@]}" とすると a と "b c" という二つの引数に展開されます。
  3. 変数 kv に入っている "a=>A"という文字列から a の部分を取り出しています。
    • ${kv%=>*} は変数kvの値の後方から =>* にマッチする部分を削除した値を返します。つまり変数 k には a が入ります。
  4. 変数 kv に入っている "a=>A"という文字列から A の部分を取り出しています。
    • ${kv#*=>} は変数kvの値の前方から *=> にマッチする部分を削除した値を返します。つまり変数 k には A が入ります。
  5. 変数 k と v の値を出力しています。
id:nannde

ありがとうございます!

バッチリでした!!

かなりテクニックが必要なんですね。

詳しいご解説がとてもとても助かります m(_ _)m

ありがとうございました!!

2009/09/16 15:24:19

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません