
我在 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
。