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

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

新規登録して質問してみよう
ただいま回答率
85.35%
bash

bash(Bourne-again-Shell)は sh(Bourne Shell)のインプリメンテーションに様々な機能が追加されたシェルです。LinuxやMac OS XではBashはデフォルトで導入されています。

シェルスクリプト

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

多次元配列

1次元配列内にさらに配列を格納している配列を、多次元配列と呼びます。

zsh

zshは、UNIX系OSのシェルの1つです。 cshやksn系のコマンドライン編集機能も実装されたシェルです。

Q&A

解決済

2回答

10472閲覧

シェルスクリプトで2次元配列を扱いたい

ev_ham

総合スコア2

bash

bash(Bourne-again-Shell)は sh(Bourne Shell)のインプリメンテーションに様々な機能が追加されたシェルです。LinuxやMac OS XではBashはデフォルトで導入されています。

シェルスクリプト

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

多次元配列

1次元配列内にさらに配列を格納している配列を、多次元配列と呼びます。

zsh

zshは、UNIX系OSのシェルの1つです。 cshやksn系のコマンドライン編集機能も実装されたシェルです。

0グッド

1クリップ

投稿2021/08/13 05:12

編集2021/08/13 05:35

前提・実現したいこと

以下のような処理フローを、シェルスクリプトで実装したいです。

  1. 2つの引数を持つコマンド(シェルスクリプトファイルの名前)が叩かれる
  2. 定数を保持する2次元配列に対して、全要素の末尾に1の処理の引数を追加するという操作を行う
  3. 2の処理後の2次元配列に対して、ループを回し、結果を一つずつ、引数を持つ関数に渡す
  4. 関数を実行する

他の言語(JavaScript)ではすぐ実装できたのですが、bashで2次元配列を扱うのは一手間いる、かつ変数のスコープが厄介ということでなかなか実装できません。
お知恵を拝借できますと幸いです。

JavaScriptで書いたコード(動いた)

JavaScript

1function smtFunc(arg1, arg2, arg3, arg4, arg5) { 2 // 何らかの処理 3 // ここでは単にコンソール出力 4 console.log(arg1, arg2, arg3, arg4, arg5); 5 6 // 本来であれば以下のように渡していきたい 7 // command --opt1 $1 --opt2 $2 --opt3 $3 --opt4 $4 --opt5 $5 8} 9 10// 決まった値を初期値として持つ 11let set_arrays = [ 12 ["aSet1", "bSet1", "cSet1"], 13 ["aSet2", "bSet2", "cSet2"], 14]; 15 16// shellコマンドが叩かれた際に入ってくる値 17const inp1 = "inp1"; 18const inp2 = "inp2"; 19 20for (let i = 0; i < set_arrays.length; i ++) { 21 set_arrays[i].push(inp1, inp2); 22} 23 24// for文の結果、以下が得られる 25// [["aSet1", "bSet1", "cSet1", "inp1", "inp2"], ["aSet2", "bSet2", "cSet2", "inp1", "inp2"]] 26 27for (let i = 0; i < set_arrays.length; i ++) { 28 smtFunc( 29 set_arrays[i][0], 30 set_arrays[i][1], 31 set_arrays[i][2], 32 set_arrays[i][3], 33 set_arrays[i][4], 34 ); 35}

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

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

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

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

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

guest

回答2

0

地味な方法でやってみました。

arrays.txt

aSet1 bSet1 cSet1 aSet2 bSet2 cSet2

inp.txt

inp1 inp2

シェルスクリプト

function smtFunc() { echo $1 $2 $3 $4 $5 } inp=`paste -s -d' ' inp.txt` echo $inp >tmp.txt echo $inp >>tmp.txt paste -d' ' arrays.txt tmp.txt | \ while read x1 x2 x3 x4 x5 do smtFunc $x1 $x2 $x3 $x4 $x5 done

投稿2021/08/13 12:11

takasima20

総合スコア7464

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

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

0

ベストアンサー

個々の要素に空白文字が含まれないなら、空白文字区切りの文字列にするのが良いでしょう。

Bash

1function smtFunc() { 2 echo arg1=$1, arg2=$2, arg3=$3, arg4=$4, arg5=$5 3} 4 5set_arrays=("aSet1 bSet1 cSet1" "aSet2 bSet2 cSet2") 6 7inp1="inp1" 8inp2="inp2" 9 10work=() 11for x in "${set_arrays[@]}" 12do 13 work+=("$x $inp1 $inp2") 14done 15set_arrays=("${work[@]}") 16 17for x in "${set_arrays[@]}" 18do 19 smtFunc $x 20done

投稿2021/08/13 06:15

otn

総合スコア85901

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

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

ev_ham

2021/08/13 06:50 編集

ありがとうございます! smtFunc $xで呼んだら、arg1="aSet1 bSet1 cSet1 inp1 inp2" arg2= arg3= ... になるんですが、 arg1=に入れる前に、分割しとくってことですね。
otn

2021/08/13 07:29

> smtFunc $xで呼んだら、 そんなはずは無いです。 smtFunc "$x" としてしまったのでは?
ev_ham

2021/08/13 07:47

貼っていただいたスクリプトをそのままコピペして コマンドで実行すると、以下の結果が得られます。 [コマンド] smtFile.sh one two [結果] arg1=aSet1 bSet1 cSet1 inp1 inp2, arg2=, arg3=, arg4=, arg5= arg1=aSet2 bSet2 cSet2 inp1 inp2, arg2=, arg3=, arg4=, arg5=
otn

2021/08/13 08:17

もしかして、bashじゃなくてzshですか? 回答に書いたのは、コードブロックの言語欄にあるとおり、Bash用です。 zshなら、 setopt SH_WORD_SPLIT するか、 smtFunc $x の行を eval smtFunc $x にしてください。evalだとbashでもzshでもOKでしょう。
ev_ham

2021/08/13 10:29

あ、大変失礼しました。 おっしゃる通り、zshでした。 eval smtFunc $xを実行し、 arg1=aSet1, arg2=bSet1, arg3=cSet1, arg4=inp1, arg5=inp2 arg1=aSet2, arg2=bSet2, arg3=cSet2, arg4=inp1, arg5=inp2 が返ってきました。 ありがとうございます!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問