シェルスクリプト(bash)で
ITEM='"m/s" "kg m^-2" "J s^-1" "N"' VAR='a b c d'
のような文字列リストを複数定義した上で
画面に
m/s a kg m^-2 b J s^-1 c N d
のように同時出力させる(echo ${ITEM} ${VAR})ループを書きたいのですが,どうすればいいでしょうか?
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答4件
0
ベストアンサー
一旦配列に入れて、添え字で回します。
Bash
1ITEM='"m/s" "kg m^-2" "J s^-1" "N"' 2VAR='a b c d' 3 4eval ITEMS=($ITEM) 5VARS=($VAR) 6 7for((i=0;i<${#ITEMS[@]};i++)) 8do echo ${ITEMS[$i]} ${VARS[$i]} 9done
投稿2018/03/13 13:01
総合スコア84555
0
解決したようですが参考までに…
#!/bin/bash ITEM='"m/s" "kg m^-2" "J s^-1" "N"' VAR='a b c d' paste -d ' ' <(echo $ITEM | sed 's/" "/\t/g;s/"//g' | tr "\t" "\n") <(echo $VAR | tr ' ' "\n")
bash ならこんなかんじでいける気がするのですが、
動作確認してないので間違ってたら申し訳ない。
投稿2018/03/14 01:38
総合スコア7458
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
素のシェルスクリプトでは困難な気がするので、awkを使いました。
sh
1ITEM='"m/s" "kg m^-2" "J s^-1" "N"' 2VAR='a b c d' 3awk -v a="$ITEM" -v b="$VAR" 'BEGIN{ 4 while(match(a, /"[^"]*"/)){ 5 i++; 6 aa[i] = substr(a, RSTART+1, RLENGTH-2); 7 a=substr(a, RSTART+RLENGTH); 8 } 9 split(b, bb, " "); 10 for(j=1; j<=i; j++){ 11 printf "%s %s\n", aa[j], bb[j]; 12 } 13}'
投稿2018/03/13 07:32
総合スコア13671
0
bashのパターン照合演算子をつかって、ふたつ目の変数を一つづつ減らしていけば。
bash
1#!/bin/bash 2 3ITEM='"m/s" "kg m^-2" "J s^-1" "N"' 4VAR='a b c d' 5ITEM=`echo $ITEM | sed -e 's/(\w) /\1:/g'` 6 7 8for i in $ITEM 9do 10 echo $i" "${VAR%% *} | sed -e 's/[:"]/ /g' 11 VAR=${VAR#* } 12done 13
投稿2018/03/13 07:15
編集2018/03/13 07:36総合スコア727
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/03/14 02:36
2018/03/29 08:01
2018/03/29 11:19