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

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

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

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

for

for文は、様々なプログラミング言語で使われている制御構造です。for文に定義している条件から外れるまで、for文内の命令文を繰り返し実行します。

MacOS(OSX)

MacOSとは、Appleの開発していたGUI(グラフィカルユーザーインターフェース)を採用したオペレーションシステム(OS)です。Macintoshと共に、市場に出てGUIの普及に大きく貢献しました。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

2回答

508閲覧

Bash 二つの配列の連結表示

n2022

総合スコア39

bash

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

for

for文は、様々なプログラミング言語で使われている制御構造です。for文に定義している条件から外れるまで、for文内の命令文を繰り返し実行します。

MacOS(OSX)

MacOSとは、Appleの開発していたGUI(グラフィカルユーザーインターフェース)を採用したオペレーションシステム(OS)です。Macintoshと共に、市場に出てGUIの普及に大きく貢献しました。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

0クリップ

投稿2022/02/16 09:08

Macのターミナルで、配列の要素を2つつなげようとしています。
下記の通りに行うと、期待通りの結果になります。

A=("L02_M3" "L03_M4")
B=("T16" "T16")
for ((i=0; i<${#A[@]}; i++))
do
echo ${A[$i]}–${B[$i]}
done

結果
L02_M3–T16
L03_M4–T16

実際には、Aの要素自体が変わるので、A1, A2, A3…のように配列Aを何個か用意することにして、その時に必要なAをCで受けることにしようとしています。下記のように変更すると、Aにあった個別の要素を見ずに、最後に1回だけBの要素をつなげた値を返してしまいます。どこを改善すれば上と同じような結果になるのでしょうか。
A=("L02_M3" "L03_M4")
B=("T16" "T16")
C=${A[@]}
for ((i=0; i<${#C[@]}; i++))
do
echo ${C[$i]}–${B[$i]}
done

結果
L02_M3 L03_M4–T16

Bashで走る文を紹介していただけるとありがたいです。また、簡単な解説も希望します。どうぞよろしくお願いいたします。

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

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

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

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

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

guest

回答2

0

ベストアンサー

リファレンス(参照)を使う方法もあります。

bash

1$ help declare 2 : 3 Options which set attributes: 4 : 5 -n make NAME a reference to the variable named by its value

concat.sh

bash

1A=("L02-M3" "L03-M4") 2B=("T16" "T16") 3declare -n C=A 4 5for ((i=0; i<${#C[@]}; i++)) 6do 7 echo ${C[$i]}${B[$i]} 8done

実行結果

bash

1$ bash concat.sh 2L02_M3–T16 3L03_M4–T16

投稿2022/02/16 09:24

編集2022/02/16 09:38
melian

総合スコア19803

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

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

n2022

2022/02/16 15:36

こちらの方が、分かりやすいですが、自分のPCでは、declare -n で、 -bash: declare: -n: invalid optionとなってしまいます。
melian

2022/02/16 15:50

Mac OSX デフォルトの bash は 3.x 系なので declare で -n オプションが使えない、という事を失念しておりました。declare -n を使いたい場合は、別途 bash 4.x をインストールする必要があります。
n2022

2022/02/17 00:54

バージョンが古いと便利な機能も使えないということですね。徐々にアップグレードしてゆきたいと思います。問題も解決しました。ありがとうございました。
guest

0

Cの右側を()でくくったら、問題は解決はしました。でも理由が分かりません。
A=("L02_M3" "L03_M4")
B=("T16" "T16")
C=(${A[@]})
for ((i=0; i<${#C[@]}; i++))
do
echo ${C[$i]}–${B[$i]}
done

結果
L02_M3–T16
L03_M4–T16

投稿2022/02/16 09:18

n2022

総合スコア39

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

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

melian

2022/02/16 09:25

被ってしまいました。。。() を付けることで配列になります。
otn

2022/02/16 09:37

理由と言われても、C=${A[@]} だとCは配列じゃないからとしか言い様がないです。
n2022

2022/02/16 15:30

配列の定義の仕方に関する意識が甘かったです。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問