#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
для выполнения косвенной ссылки.