簡體   English   中英

BASH將變量拆分為字符,並在for循環中打印出空格

[英]BASH split variable in characters and print out space in for loop

我正在嘗試創建一個精美的歡迎消息,以在終端打開時顯示。 我已經用以下代碼在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 !

此代碼有兩個問題:

  1. 我不知道如何在逗號后打印空白區域,輸出只是Welcome,simon! 如何使它輸出一個空格呢?
  2. 當然,它會整體打印$USER 我希望它逐個字符地顯示,我該怎么做?

您可以使用標准的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。 用引號將該部分括起來可確保也打印空格和制表符之類的內容。

您可以很容易地指定空間; 將其用引號引起來:

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值中的空格或特殊字符。)

可能有 一些方法可以在不調用諸如sed類的單獨過程的情況下進行; 請參閱啟發式方法答案 所以,那樣做。 但是請注意,它與bash牢固地結合在一起,因此該答案並不完全與bash緊密結合-您可以用echo "$USER" | ...輕松替換<<<表示法(僅bash -only) echo "$USER" | ... echo "$USER" | ...代替。

完全POSIXly可移植,即沒有那些討厭的bashisms,並且沒有sed的分支:

#!/bin/sh

m="Welcome, $USER!"
while test ${#m} -gt 0; do
  r=${m#?}
  printf '%s ' "${m%%$r}"
  m=$r
  sleep 0.05
done
printf '\n'

請注意,睡眠不到一秒的時間是不可攜帶的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM