基於n次迭代從until循環變數派生n個變數的Bash腳本不起作用

基於n次迭代從until循環變數派生n個變數的Bash腳本不起作用

我在 Bash 腳本中遇到以下問題:

執行腳本時,會開啟一個 Zenity 彈出框,詢問應會出現多少個日期條目。例如,如果輸入 3,則會開啟另外 3 個 Zenity 方塊(一個接一個)以要求輸入日期。

由此我可以產生兩個變數($tvar$date_entry_number)。$date_entry_number捕獲輸入的日期數量並$tvar捕獲輸入的所有日期,以空格分隔。在$date_entry_number= 3的情況下,$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+=(...)將括號中的內容追加到 array 的末端tvar。我們使用它來附加輸入的每個新日期。

Bash 擴展${!tvar[@]}為數組的列表指數。如果i是一個指數在數組中,如上面的程式碼所示,我們可以使用${tvar[i]} It 我們想要數組的列表來存取相應的值價值觀,我們會使用${tvar[@]}

man bash有關 bash 數組的許多強大功能的更多信息,請參閱標題為 的部分Arrays

相關內容