n 回の反復に基づいて until ループ変数から n 個の変数を導出する Bash スクリプトが機能しない

n 回の反復に基づいて until ループ変数から n 個の変数を導出する Bash スクリプトが機能しない

Bash スクリプトで次の問題が発生します。

スクリプトを実行すると、Zenity ポップアップ ボックスが開き、日付の入力回数を尋ねられます。たとえば 3 を入力すると、さらに 3 つの Zenity ボックスが (次々に) 開き、日付の入力を求められます。

$tvarこれにより、2 つの変数 (および)を生成できます$date_entry_number$date_entry_numberは入力された日付の数を取得し、 は$tvar空白で区切られた、入力されたすべての日付を取得します。 = 3 の場合$date_entry_number$tvar= になる可能性があります'2020-07-02' '2020-07-03' '2020-07-04'

私がやろうとしているのは、 の個々の日付を含む変数を作成することです。$tvarたとえば、任意の数値になる可能性$tvar1='2020-07-02' $tvar2='2020-07-03' $tvar3='2020-07-04'のある を基準とし$date_entry_numberます。これは、 に任意の数の日付が存在する可能性があることを意味します$tvar

私の考えでは、以下のスクリプトにあるように for ループが必要だと思いますが、これを適切に行う方法がわかりません。誰か助けてくれませんか?

#!/bin/bash

date_entry_number="$(zenity --entry --text "ENTER number of date_entries:" --entry-text "1")"
        a=1 

tvar=$(until
        [[ $date_entry_number -lt $a ]]
do

date_out="$(zenity --calendar \
--title="Select a Date" \
--text="Click on a date to select that date." \
--date-format="'%G-%m-%d'")"

var="${date_out}"

echo $var

let a++

done)

echo $tvar
echo $date_entry_number

for i in {1..$date_entry_number}
do

        nvar{1..$tvar}

done

echo $nvar{1..$tvar}

答え1

のような変数を作成することもできますtvar1が、bashでは配列tvarこれは全体的に優れたアプローチです。各日付をエントリとして含む配列を作成する方法は次のとおりです。

#!/bin/bash    
date_entry_number="$(zenity --entry --text "ENTER number of date_entries:" --entry-text "1")"

tvar=()
a=1
until [[ $date_entry_number -lt $a ]]
do
    tvar+=("$(zenity --calendar \
        --title="Select a Date" \
        --text="Click on a date to select that date." \
        --date-format="'%G-%m-%d'")")
    let a++
done

# Show what's in the array
declare -p tvar

# Loop through the indices of the array
for i in "${!tvar[@]}"
do
    echo "date $i = ${tvar[i]}"
done

上記では、tvar=()という配列を作成しますtvar

tvar+=(...)括弧内の内容を配列の末尾に追加しますtvar。これを使用して、新しい日付が入力されるたびに追加します。

Bashは${!tvar[@]}配列のリストに展開しますインデックス.i索引配列では、上記のコードのように、対応する値にアクセスできます。${tvar[i]} 配列のリストが必要でした。価値観、私たちは${tvar[@]}

bash 配列の多くの強力な機能の詳細については、man bash「」のセクションを参照してくださいArrays

関連情報