我在 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'
base ,$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[@]}
man bash
有关 bash 数组的众多强大功能的详细信息,请参见题为的部分Arrays
。