-z
в оболочке не будет указано, является ли значение целым или нет, а будет ли его длина > 0.
Вы можете сделать то же самое в awk с помощьюlength
--if(length($1))...
Если вы хотите проверить, является ли переменная или поле числом или нет в awk
, вы можете сделать это:
if($1+0 || $1~/^[+-]?0/)...
Ваше выражение if(-z $1)
просто инвертирует неустановленную переменную z
, что даст 0
, а затем добавит 0
к полю $1
, создав непустую -строку, которая будет всегда считается TRUE, , даже если$1
была пустой строкой ""
или числом 0
.
Немного поигравшись, я нашел кое-что, что работает. По сути, идея состоит в том, чтобы вернуть текст, который вы пишете, написать пробелы над ними, а затем вернуться назад над теми, (escape \b
только перемещает курсор, а не удаляет ).
Я думаю, именно поэтому такие приложения, как gcloud, отображают один символ вместо текста. Я не хотел анимировать что-то в Bash и не видел ни одного хорошего символа, который мог бы представлять загрузку, поэтому я сделал следующее:
# \e[2m = dim, \e[0m = reset
echo -ne "\e[2mLoading...\e[0m"
# do the slow thing...
# same number of `\b` and ` ` as "Loading..."
echo -ne "\b\b\b\b\b\b\b\b\b\b \b\b\b\b\b\b\b\b\b\b"
Не обнаружил никаких проблем, кроме уродливого кода.
Вот небольшая анимация:
animation() {
tput civis
while true; do
for i in {1..3}; do
echo -ne "."
sleep 1
done
for i in {1..3}; do
echo -ne "\b \b"
sleep 1
done
done
tput civvis
}
kill_animation() {
kill $anim
echo
}
echo -n "Loading" && animation & anim=$!
sleep 10
kill_animation
Результат такой: