未能向该循环添加退出

Ern*_*dez 3 bash scripts

发现这个有趣的脚本可以在你的终端内画雪,但是......我希望有一个选项可以随时输入“q”来退出循环。这就是我所拥有的;

 

 LINES=$(tput lines)
COLUMNS=$(tput cols)
 
declare -A snowflakes
declare -A lastflakes
 
clear

function move_flake() {    

i="$1"
 
if [ "${snowflakes[$i]}" = "" ] || [ "${snowflakes[$i]}" = "$LINES" ]; then
snowflakes[$i]=0
else
if [ "${lastflakes[$i]}" != "" ]; then
printf "\033[%s;%sH \033[1;1H " ${lastflakes[$i]} $i
fi
fi
 
printf "\033[%s;%sH*\033[1;1H" ${snowflakes[$i]} $i
 
lastflakes[$i]=${snowflakes[$i]}
snowflakes[$i]=$((${snowflakes[$i]}+1))
}
 
while :
do
    
i=$(($RANDOM % $COLUMNS))
 
move_flake $i

for x in "${!lastflakes[@]}"
do
move_flake "$x"
done
 
sleep 0.1
done
Run Code Online (Sandbox Code Playgroud)

这是我尝试添加的;

echo "Type 'q' to exit out"
while read -n1 -r -p "want to exit the script?"
do
    if [[ $REPLY == q ]];
    then
        break;
    else
        #whatever
    fi
done
Run Code Online (Sandbox Code Playgroud)

将其添加到函数中,但仅在开头询问“q”。然后尝试在退出循环中添加实际的脚本,并且只绘制一片雪花,然后再次询问我是否要退出......知道如何使这项工作起作用吗?

sud*_*dus 5

您可以在 shell 中执行此操作bash:将sleep命令替换为read具有超时的命令,然后检查while您的'q'. 看

help read | less
Run Code Online (Sandbox Code Playgroud)

这是我对你的雪秀的版本,

#!/bin/bash

LINES=$(tput lines)
COLUMNS=$(tput cols)

declare -A snowflakes
declare -A lastflakes
 
clear

function move_flake() {    

i="$1"
 
if [ "${snowflakes[$i]}" = "" ] || [ "${snowflakes[$i]}" = "$LINES" ]; then
snowflakes[$i]=0
else
if [ "${lastflakes[$i]}" != "" ]; then
printf "\033[%s;%sH \033[1;1H " ${lastflakes[$i]} $i
fi
fi
 
printf "\033[%s;%sH*\033[1;1H" ${snowflakes[$i]} $i
 
lastflakes[$i]=${snowflakes[$i]}
snowflakes[$i]=$((${snowflakes[$i]}+1))
}
 
while [ "$ans" != "q" ]
do
    
 i=$(($RANDOM % $COLUMNS))
 
 move_flake $i

 for x in "${!lastflakes[@]}"
 do
  move_flake "$x"
 done
 read -sn 1 -t 0.1 ans
done
Run Code Online (Sandbox Code Playgroud)