シェルスクリプトを使用して回転アニメーションを作成する方法


10

私は文字を使用して回転アニメーションを作成するスクリプトを探しています/-|\

これらのキャラクターを継続的に切り替えると、回転しているように見えるはずです。これを作るには?

回答:


21

そのスクリプトを使用します。

#!/bin/bash

chars="/-\|"

while :; do
  for (( i=0; i<${#chars}; i++ )); do
    sleep 0.5
    echo -en "${chars:$i:1}" "\r"
  done
done

whileループが無限に実行されます。forループはで与えられた文字列の各文字トラフ実行されます$charsechoキャリッジリターン付きで\r改行なしで文字を出力し-nます。-eエコーを強制して、などのエスケープシーケンスを解釈させます\r。各変更の間に0.5秒の遅延があります。


賢い、+ 1、でもなぜprintf "%s\r" "${chars:$i:1}"ですか?
terdon

1
@terdonの最初の考えはecho...でしたが、もちろんうまくいきprintfます。^^
混乱

20

\bこれはを使用した例です。これは、同じ文字を何度も上書きし続けるために、カーソルを1列左に移動するように端末エミュレータに指示します。

#!/usr/bin/env bash

spinner() {
    local i sp n
    sp='/-\|'
    n=${#sp}
    printf ' '
    while sleep 0.1; do
        printf "%s\b" "${sp:i++%n:1}"
    done
}

printf 'Doing important work '
spinner &

sleep 10  # sleeping for 10 seconds is important work

kill "$!" # kill the spinner
printf '\n'

詳細については、BashFAQ 34を参照してください。


7
素晴らしいコード。ただし、小さな変更を1つ加えます。を実行した後spinner &、pidをローカル変数に格納してからspinner_pid=$!、kill呼び出しをkill $spinner_pid &>/dev/null
dberm22

1

あなたは明示的にbashを要求しないので、これは魚の殻のための小さなプラグで、これは美しくIMOで解決できます:

set -l symbols    
while sleep 0.5
    echo -e -n "\b$symbols[1]"
    set -l symbols $symbols[2..-1] $symbols[1]
end

この場合、symbolsは配列変数であり$symbols[2..-1]、最初のエントリを除くすべてのエントリであるため、回転またはシフトした場合の内容です。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.