Поведение zsh до тех пор, пока поведение переменной цикла

#loops #variables #echo #zsh

#Циклы #переменные #Эхо #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 … и т.д. и вывести соответствующую дату, которой присвоена переменная. Но почему оболочка не возвращает каждую переменную $sqlday[0-5] в качестве каждой соответствующей даты? Когда я повторяю «$ sqlday0», он ссылается на глобальную переменную, но в цикле возникает проблема — почему это так и как мне заставить это работать? Я просто повторил $ sqlday0 вручную, потому что я не был уверен, почему echo $ var1 не извлекал дату в цикле.

Ответ №1:

Внутри вашего цикла вы выполняете

 echo "$sqlday0"
  

это означает, что вы всегда печатаете значение одной и той же переменной, sqlday0 . Поскольку вы никогда не меняете содержимое этой переменной, я не понимаю, почему вы ожидаете другого значения на каждой итерации.

Что меняется внутри цикла, так это содержимое var1 , поэтому, если вы выполняете

 echo ${(P)var1}
  

на каждой итерации вы увидите разные значения sqlday. Или, конечно, лучшим решением было бы использовать массив sqlday вместо скаляра, чтобы вы могли ссылаться на отдельные дни $sqlday[$i] , что также устраняет необходимость использования вспомогательной переменной var1 для выполнения косвенной ссылки.