我想從用戶那里得到一個字串,例如 adem。然后像 ascii 文本一樣列印出來。字符也應該改變(不僅點它可能 * - 無論用戶輸入什么。)
.
. .
.......
. .
. .
這是我的 bash 腳本。我認為如果我將它們分成每一行會很有用。然后為每一行連接每個字母自己的行。
echo Enter text:
read text
echo Enter character style:
read k
row1=([a]=" $k " [b]="$k$k$k$k$k" [c]="$k$k$k$k$k")
row2=([a]="$k $k" [b]="$k $k" [c]="$k ")
row3=([a]="$k $k" [b]="$k$k$k$k$k" [c]="$k ")
row4=([a]="$k$k$k$k$k" [b]="$k $k" [c]="$k ")
row5=([a]="$k $k" [b]="$k$k$k$k$k" [c]="$k$k$k$k$k")
strlen=${#text}
# Testing echo.
echo " $k $k $k "
echo $satir1[a]
for((i=0; i<=strlen; i ))
do
echostrline1 =${row1[${text:i:1}]}
echostrline2 =${row2[${text:i:1}]}
echostrline3 =${row3[${text:i:1}]}
echostrline4 =${row4[${text:i:1}]}
echostrline5 =${row5[${text:i:1}]}
done
echo $echostrline1
echo $echostrline2
echo $echostrline3
echo $echostrline4
echo $echostrline5
我有三個問題,在這里。
- 首先我無法訪問 row1[a] 它不起作用 >> echo $satir1[a] (列印最后一個元素)
- 當我運行腳本時,它沒有按我預期的方式列印。
- 如果我輸入 * 作為字符,它會列印目錄內容。
我試圖改變這樣的回圈。
for((i=0; i<strlen; i ))
do
echostrline1 =" ${satir1[${metin:i:1}]}"
echostrline2 =" ${satir2[${metin:i:1}]}"
echostrline3 =" ${satir3[${metin:i:1}]}"
echostrline4 =" ${satir4[${metin:i:1}]}"
echostrline5 =" ${satir5[${metin:i:1}]}"
done
uj5u.com熱心網友回復:
如果您將腳本粘貼到https://www.shellcheck.net/并修復那里的錯誤,那么您的所有問題都應該得到解決。這是一個很棒的工具。試試看!
- 首先我無法訪問 row1[a] 它不起作用 >> echo $satir1[a] (列印最后一個元素)
bash 中的陣列訪問不起作用,除非您在擴展周圍添加(否則為可選的)括號:$satir1[a]--> ${satir1[a]}。
- 如果我輸入 * 作為字符,它會列印目錄內容。
因為echo $echostrline1末尾沒有參考,特殊符號如*和?被解釋為 glob 模式。參考可以防止這種情況。
- 當我運行腳本時它沒有按我預期的方式列印
這很模糊。像這樣的問題應該舉一個具體的例子。主要問題可能也是缺少參考echo $echostrline1。由于未參考的變數擴展中的單詞拆分x="a b c"; echo $x將被列印為a b c(重復的空格被壓扁)。
此外,就像 markp-fuso 評論的那樣,關聯陣列必須明確定義為這樣使用declare -A row1=(...)
順便說一句:((i=0; i<=strlen; i ))迭代一次太多。例如text=abc,有三個字母,但回圈嘗試訪問0第 th、1th、2nd 和3rd 字母(不存在)。
為每一行手動定義一個陣列似乎有點復雜,也使得更改字母大小變得更加困難。因此,我提出以下解決方案:
#! /bin/bash
IFS= read -p"Enter text: " -r text
IFS= read -p"Enter character style: " -n1 -r k
echo; echo
declare -A index=([A]=0 [b]=1 [c]=2 [u]=3)
while IFS=: read -r -a font; do
for ((i=0; i<${#text}; i )); do
char=${text:i:1}
glyph="${font[${index[$char]}]}"
printf %s "${glyph//W/$k}"
done
echo
done << 'EOF'
WW :W : : :
W W :WWW : WW :W W :
WWWW :W W :W :W W :
W W :WWW : WW : WWW :
EOF
示例用法
Enter text: bAcubA
Enter character style: @
@ @@ @ @@
@@@ @ @ @@ @ @ @@@ @ @
@ @ @@@@ @ @ @ @ @ @@@@
@@@ @ @ @@ @@@ @@@ @ @
awk用.或任何其他語言實作相同的東西perl會比用普通的 bash 更容易和更有效。但我認為您已經知道這一點,并將其視為 bash 中的一個練習。否則,您可以使用banner、figlet、toilet或其他類似的工具。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/532260.html
標籤:重击壳
