1

ターミナルを開いたときに表示される派手なウェルカム メッセージを作成しようとしています。私はこのコードでJavaでそれを行いました:

public void slowPrint() {
    String message = "Welcome, " + System.getProperty("user.name");

    try {
        for(int i = 0; i < message.length(); i++) {
            System.out.print(message.charAt(i));
            Thread.sleep(50);
        }
    } catch(InterruptedException ex) {
        ex.printStackTrace();
    }
}

今、私はbashにかなり慣れていませんが、このコードを作成することができました:

for i in W e l c o m e , $USER; do
    echo -ne $i
    sleep 0.05
done

echo !

このコードには 2 つの問題があります。

  1. コンマの後にプレーンスペースを出力する方法がわかりません。出力はWelcome,simon!、代わりにスペースを出力するにはどうすればよいですか?
  2. もちろん、$USER単語全体として出力されます。文字単位で表示したいのですが、どうすればいいですか?
4

3 に答える 3

4

標準の for ループを使用して同じ効果を得ることができます。

MESSAGE="Welcome, $USER"
for (( i=0; i<${#MESSAGE}; i++ )); do
    echo -ne "${MESSAGE:$i:1}"
    sleep 0.05
done
echo !

この${MESSAGE:$i:1}構文は、文字列i内の位置から 1 の部分文字列を取ります。その部分を引用符で囲むと、スペースやタブなども確実に出力されます。

于 2013-03-30T10:37:57.783 に答える
2

スペースは簡単に指定できます。引用符で囲みます。

for i in W e l c o m e , ' ' ...

個別の文字への分割$USERは、さまざまな方法で行うことができます。私がそれを行う方法は古風ですが信頼できます:

for i in W e l c o m e , ' ' $(sed 's/./& /g' <<< "$USER")

この<<<操作によってプロセスとパイプが保存されることに注意してください。の標準入力をリダイレクトsedして、指定された文字列を入力行として読み取ります。

または、ユーザー名にスペースやその他の特殊文字が含まれていると思われる場合は、次のようにします。

for i in W e l c o m e , ' ' $(sed "s/./'&' /g" <<< "$USER")

(これは完全な証拠ではありません。値USER="Tam O'Shanter"は多少の悲しみを引き起こし、代わりにその単純な修正が問題を引き起こしUSER='Will "O'\''Wisp" Light'ます。...つぶやく、つぶやく、難解な呪文、...

    for i in W e l c o m e , ' ' $(sed "s/./'&' /g; s/'''/\\\\'/g" <<< "$USER")

ただし、すべてを一重引用符で囲んで名前をエコーし​​ます。不平を言う、不平を言う、...なぜ私がこれを両方ともしないのかを理解したと思います...スペースも邪魔になります...私は単純な最初のバージョンを使用して、人々にそうしないように言いますの値に空白または特殊文字を使用するには$USER。)

などの別のプロセスを呼び出さずにそれを行う方法があるかもしれませ sedheuristicusによる回答を参照してください。だから、そのようにしてください。ただし、この回答が完全に関連付けられているわけではなく、しっかりと関連付けられていることに注意してください。代わりに、表記法 ( -only) を簡単に置き換えることができます。bashbash<<<bashecho "$USER" | ...

于 2013-03-30T10:33:53.510 に答える