6

インストール関連のタスクを実行するシェル スクリプトを作成したいと考えています。文字 |、/、\、- を出力して円を回転させるようなアイコンを表示したい。インストールが完了すると、この円は消えます。これに関する助けをいただければ幸いです。

4

6 に答える 6

4

Marc Bの回答に基づいて、簡単なデモを次に示します。

spin () {

  chars="| / – \\"

  rotations=3

  delay=0.1

  for i in `seq 0 $rotations`; do

    for char in $chars; do 

      echo -ne $char
      sleep $delay
      echo -ne '\b'

    done

  done

}

ターミナルに貼り付けて、「spin」と入力します。


更新: このバージョンは bash と zsh の両方で動作します。

spin () {

  char=( \| / – \\ )

  charLastIndex=3

  rotations=3

  delay=0.1

  for i in `seq 1 $rotations`; do

    for j in `seq 0 $charLastIndex`; do 

      echo -n ${char[$j]}
      sleep $delay
      echo -ne '\b'

    done

  done

}

更新: liori のバージョンは複数のシェルで動作します。

spin () {
  rotations=3
  delay=0.1
  for i in `seq 0 $rotations`; do
    for char in '|' '/' '-' '\'; do
      #'# inserted to correct broken syntax highlighting
      echo -n $char
      sleep $delay
      printf "\b"
    done
  done
}
于 2012-05-06T12:09:30.960 に答える
2
echo -e 'abc\bd'
            ^^---backspace char

出力します

abd

つまり、基本的には、アニメーション文字の1つを出力し、次にバックスペースを出力し、次の文字を出力するなどです。

于 2012-05-06T11:26:44.727 に答える
2

受け入れられた解決策は非常に複雑です。あなたはただ行うことができます:

while sleep 1; do 
  i=$((++i%4 + 2)); 
  printf '\b|/-\' | cut -b 1,$i | tr -d '\n';
done

(1 秒未満のスリープは移植性がなく、seq でもないことに注意してください。)

于 2012-05-06T16:14:17.657 に答える
0

POSIX シェル準拠のバージョンは次のとおりです。

while true; do for x in '|' '/' '-' '\'; do printf '\b$x'; sleep 1; done; done

副作用として、値xが上書きされることに注意してください。これを回避するには、命令を関数に含めます。

于 2016-01-18T14:28:22.167 に答える