基于 n 次迭代从循环变量中导出 n 个变量的 Bash 脚本不起作用

基于 n 次迭代从循环变量中导出 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'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

相关内容