bash 脚本并尝试理解 echo 命令

bash 脚本并尝试理解 echo 命令

我正在学习 bash 脚本,当我在处理脚本中的某些内容时正在寻找自己创建一个旋转器时,我遇到了这段代码这个问题

i=1
sp="/-\|"
echo -n ' '
while true
do
printf "\b${sp:i++%${#sp}:1}"
done

这就是我一直在寻找的:一个不连接的微调器类型,只是删除其条目并回显中的下一个字符$sp

然而我不明白这是如何运作的

printf "\b${sp:i++%${#sp}:1}"

有人可以为我详细说明一下,以便我了解发生了什么吗?从编程的角度来看,它看起来像一个三元 for 循环,但在sp:i++我迷失之后。我知道 1 表示仅在 var 中显示一个字符$sp

我也知道这while永远都会结束。

还值得注意的是,之间存在一些差异echoprintf正如我尝试的echo那样echo "\b${sp:i++%${#sp}:1}",没有提供相同的结果...... 参考

答案1

这里有两个变量在起作用。你可以更好地看到这是怎么回事:

sp="abcd" i=0                                         # Initialisation
printf "%d %s %d\n" "$i" "${sp:i++%${#sp}:1}" "$i"    # Repeat this line a few times

您看到的是,每次使用表达式时,它$i都会增加一 ( )。$i++将 的长度取模$sp,作为字符串 的起始索引$sp。所以当$iis 时6,then 6 % 4is 2so 的第三个字符$sp被打印(字符串偏移量从零开始)

你可以像这样解压表达式,

sp="abcd" i=0
len_sp=${#sp}              # length of $sp

i=$(( i + 1 ))             # increment $i
mod_i=$(( i % len_sp ))    # wrap around length of $sp
sp_sub=${sp:mod_i:1}       # get substring of one character
printf "%s" "$sp_sub"      # print it

其他有趣的部分是echo -n ' ',它打印一个没有尾随换行符的空格,以及printf "\b",它打印一个退格键。

答案2

echo 根本没有做任何聪明的事情。它只是呼应两个字符:

  • \b是退格键。这使得它在屏幕上返回一列。

  • 可见字符,是变量 sp 中的 4 个字符之一。这使得它在屏幕上也向前移动了一格。所以它不断地将角色放在彼此之上。所以你/ - \ |按顺序看。

里面的东西${ .... }是一个使用索引循环 4 个字符的 shell 扩展i

  • 它使用子字符串扩展来选取字符,该子串扩展从 的内容中${sp:i:1}选取位置处的一个字符。i$sp

  • i++部分i每次使用时都会递增,以在 中移动一个字符sp

  • 是一个模数运算,当运行到 的末尾%时,必须“返回到开头” 。isp

  • ${#sp}一个 shell 扩展,返回 的长度sp

这个技巧需要在循环内有一个延迟(比如 sleep 0.25)来减慢旋转速度。

它需要检测到您正在等待的任何事情都已完成。如果这个 shell 启动了一个异步进程,它可以运行“jobs”并查看它现在是否没有子进程。如果它正在等待创建文件,它可以对此进行测试。

相关内容