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に1つの文字しか表示しないことを意味しています$sp

私はこれが決してwhile終わらないことを知っています。

私が試した結果が同じ結果を提供していないため、いくつかの違いがあることにもecho注目する価値があります。printfechoecho "\b${sp:i++%${#sp}:1}"引用する

ベストアンサー1

これには2つの変数があります。何が起こっているのかをよりよく見ることができます。

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

ご覧のとおり、式が使用されるたびに$i1ずつ増加します()。$i++の長さをモジュール化し、$sp文字列の先頭インデックスとして使用します$sp。したがって$i、isの6場合、3番目の文字が印刷さ6 % 4れます(文字列オフセットは0から始まります)。2$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"バックスペースキーを印刷することです。

おすすめ記事