[英]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 !
此代碼有兩個問題:
Welcome,simon!
如何使它輸出一個空格呢? $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.