首页 > 解决方案 > Zsh 行为直到循环变量行为

问题描述

#!/bin/zsh

sqlday0="2020-10-10"
sqlday1="2020-10-11"
sqlday2="2020-10-13"
sqlday3="2020-10-14"
sqlday5="2020-10-15"
sqlday6="2020-10-16"

i=0
until [[ $i -gt 5 ]] do
    var1=\$sqlday$i 
echo $var1 
echo "$sqlday0"
    ((i=i+1)) 
done

终端:

$sqlday0
2020-10-10
$sqlday1
2020-10-10
$sqlday2
2020-10-10
$sqlday3
2020-10-10
$sqlday4
2020-10-10
$sqlday5
2020-10-10

我的目标是通过 $sqlday0、$sqlday1...等循环并输出分配给变量的相应日期。但是为什么 shell 不返回每个变量 $sqlday[0-5] 作为每个相应的日期?当我回显“$sqlday0”时,它引用了全局变量,但循环出现了问题——为什么会这样,我该如何让它工作?我只是手动 echo'd $sqlday0 因为我不确定为什么 echo $var1 没有在循环中检索日期。

标签: loopsvariablesechozsh

解决方案


在你的循环中,你正在做一个

echo "$sqlday0"

这意味着您总是打印同一个变量的值,sqlday0. 由于您从不更改此变量的内容,因此我不明白为什么您期望每次迭代都有不同的值。

循环内的变化是 的内容,所以如果你var1

echo ${(P)var1}

您将在每次迭代中看到不同的 sqlday-values。或者当然更好的解决方案是使用数组sqlday 而不是标量,这样您就可以通过 引用各个天$sqlday[$i],这也避免了使用辅助变量var1进行间接引用的需要。


推荐阅读