質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
シェルスクリプト

シェルスクリプトは、UNIX系のOSもしくはコマンドラインインタプリタ向けに記述されたスクリプト。bash/zshといったシェルによって実行されるため、このように呼ばれています。バッチ処理などに使用されており、テキストファイルに書かれた命令を順に実行します。

シェル

シェル(shell)はUnix や Linux 系のOSで使用されるコマンドインタプリタを指します。

sh

shは、UNIX系OSのシェル操作の1つであり、最も基本的なシェルのことです。

Q&A

解決済

4回答

220閲覧

シェルスクリプトのループの方法

loreeeee

総合スコア40

シェルスクリプト

シェルスクリプトは、UNIX系のOSもしくはコマンドラインインタプリタ向けに記述されたスクリプト。bash/zshといったシェルによって実行されるため、このように呼ばれています。バッチ処理などに使用されており、テキストファイルに書かれた命令を順に実行します。

シェル

シェル(shell)はUnix や Linux 系のOSで使用されるコマンドインタプリタを指します。

sh

shは、UNIX系OSのシェル操作の1つであり、最も基本的なシェルのことです。

0グッド

1クリップ

投稿2018/03/13 05:30

シェルスクリプト(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ページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答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

otn

総合スコア84555

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

otn

2018/03/14 02:36

補足ですが、ITEMの一重引用符の中の二重引用符を、シェルの特殊文字としての引用符として認識させるために、evalが必要となっています。
loreeeee

2018/03/29 08:01

otnさん,回答ありがとうございます.質問なのですがfor文の#ITEMS[@]の「#」と「@」はどういう挙動をしているのでしょうか?
otn

2018/03/29 11:19

${#ITEMS[@]} で、ITEMSの要素数です。
guest

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

takasima20

総合スコア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

KojiDoi

総合スコア13671

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

loreeeee

2018/03/13 08:34

回答ありがとうございます.無事に解決致しました.追加で質問なのですが awk -v a="$ITEM" -v b="$VAR" 'BEGIN{ while(match(a, /"[^"]*"/)){ ここはどういう操作をしているのでしょうか?
KojiDoi

2018/03/13 17:00

ITEMの文字列を対象に、引用符で挟まれている部分を探し出しては配列に代入しています。詳しくは"awk 正規表現"でググってみてください。
guest

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
rogueref

総合スコア727

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

loreeeee

2018/03/13 07:23

"m/s" a "kg b m^-2" c "J d s^-1" d "N" d と出力されたのですが,「"」をcutすることはできますか?
KojiDoi

2018/03/13 07:24

"kg m^-2"がダメです。
rogueref

2018/03/13 07:36

おっと、変数に空白が含まれているのか。あんまり綺麗じゃないけどsedで取り除いて出力時に復活するようにしてみました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問