Bash无banner生成自定义字符ASCII文本脚本的三类问题求助
解决Bash ASCII字符画脚本的三个问题
修正后的完整脚本
echo "Enter text:" read -r text echo "Enter character style:" read -r k # 定义每个字符的5行ASCII图案 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} # 初始化每行的拼接字符串 echostrline1="" echostrline2="" echostrline3="" echostrline4="" echostrline5="" # 遍历输入字符串的每个字符 for ((i=0; i<strlen; i++)); do char=${text:i:1} # 拼接对应行的图案 echostrline1+="${row1[$char]}" echostrline2+="${row2[$char]}" echostrline3+="${row3[$char]}" echostrline4+="${row4[$char]}" echostrline5+="${row5[$char]}" done # 用双引号包裹变量输出,避免通配符展开和空格丢失 echo "$echostrline1" echo "$echostrline2" echo "$echostrline3" echo "$echostrline4" echo "$echostrline5"
逐个问题的解决说明
1. 数组元素访问失败
- 原脚本存在数组名拼写错误:你用了
satir1[a],但定义的数组是row1; - Bash关联数组的正确访问语法是
${row1[$char]},直接$row1[a]会被解析为普通变量$row1加上字符串[a],无法正确获取数组元素。
2. 输出不符合预期
- 循环条件错误:原脚本用
i<=strlen,但字符串索引从0开始,长度为strlen的字符串有效索引范围是0到strlen-1,多循环一次会取到空字符,破坏拼接结果,改为i<strlen即可; - 变量名不一致:修改后的循环里误用了
metin(非定义变量),要和输入变量text保持一致,同时satir要对应定义的row数组名; - 显式初始化拼接变量:提前初始化
echostrline1=""等变量,避免环境中已有同名变量干扰拼接结果。
3. 输入*时打印目录内容
- 这是Bash的通配符展开特性:当不加双引号输出变量时,变量中的
*会被替换为当前目录的所有文件名; - 解决方法是输出时必须用双引号包裹变量,如
echo "$echostrline1",保留变量原始内容;同时读取输入时用read -r,避免输入的特殊字符(如反斜杠)被转义。
内容的提问来源于stack exchange,提问作者ademclk
相关产品推荐
相关产品推荐

