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

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

ただいまの
回答率

90.34%

  • sh

    296questions

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

  • シェル

    257questions

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

  • シェルスクリプト

    111questions

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

解決済

回答 4

投稿

  • 評価
  • クリップ 1
  • VIEW 252

loreeeee

score 16

シェルスクリプト(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})ループを書きたいのですが,どうすればいいでしょうか?

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 4

checkベストアンサー

+3

一旦配列に入れて、添え字で回します。

ITEM='"m/s" "kg m^-2" "J s^-1" "N"'
VAR='a b c d'

eval ITEMS=($ITEM)
VARS=($VAR)

for((i=0;i<${#ITEMS[@]};i++))
do echo ${ITEMS[$i]} ${VARS[$i]}
done

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/03/14 11:36

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

    キャンセル

  • 2018/03/29 17:01

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

    キャンセル

  • 2018/03/29 20:19

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

    キャンセル

0

bashのパターン照合演算子をつかって、ふたつ目の変数を一つづつ減らしていけば。

#!/bin/bash 

ITEM='"m/s" "kg m^-2" "J s^-1" "N"'
VAR='a b c d'
ITEM=`echo $ITEM | sed -e 's/\(\w\) /\1:/g'`


for i in $ITEM
do
    echo $i" "${VAR%% *}  | sed -e 's/[:"]/ /g'
    VAR=${VAR#* }
done

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/03/13 16:23

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

    キャンセル

  • 2018/03/13 16:24

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

    キャンセル

  • 2018/03/13 16:36

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

    キャンセル

0

素のシェルスクリプトでは困難な気がするので、awkを使いました。 

ITEM='"m/s" "kg m^-2" "J s^-1" "N"'
VAR='a b c d'
awk -v a="$ITEM" -v b="$VAR" 'BEGIN{ 
  while(match(a, /"[^"]*"/)){
    i++;
    aa[i] = substr(a, RSTART+1, RLENGTH-2);
    a=substr(a, RSTART+RLENGTH);
  }
  split(b, bb, " ");
  for(j=1; j<=i; j++){
    printf "%s %s\n", aa[j], bb[j];
  }
}'

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/03/13 17:34

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

    キャンセル

  • 2018/03/14 02:00

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

    キャンセル

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 ならこんなかんじでいける気がするのですが、
動作確認してないので間違ってたら申し訳ない。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 90.34%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る

  • sh

    296questions

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

  • シェル

    257questions

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

  • シェルスクリプト

    111questions