如何在Linux Bash Shell中逐字符打印字符串
如何在Linux Bash Shell中逐字符打印字符串
嘿,我懂你现在的困扰啦——你想把字符串里的每个字符单独一行打印出来,但当前的脚本因为bash的默认行为,把字符串按空格拆成了两个单词输出。咱们一步步来搞定这个问题~
首先得说清楚你原来的脚本为啥不对:你用for i in ${txt[*]}的时候,bash会把变量txt里的内容按照空格、制表符、换行符(也就是默认的IFS,内部字段分隔符)分割成多个元素,所以"Hello World"就被拆成了"Hello"和"World"两个部分,循环自然就只输出这两行啦。
接下来给你几种可行的解决方案,你可以按需选择:
方法1:用fold命令(最简洁的方式)
fold命令本来是用来给文本换行的,我们可以指定每行只显示1个字符,直接一步到位:
txt="Hello World" echo "$txt" | fold -w1
执行这个命令就能得到你想要的逐字符输出~
方法2:利用bash的字符串切片特性
bash原生支持字符串切片操作,我们可以通过循环遍历字符串的每个索引位置:
txt="Hello World" for (( i=0; i<${#txt}; i++ )); do echo "${txt:i:1}" done
这里简单解释下:
${#txt}用来获取字符串的总长度${txt:i:1}表示从索引i的位置开始,截取1个字符
方法3:将字符串转成单字符数组
我们可以先把字符串拆成每个元素都是单个字符的数组,再遍历数组打印:
txt="Hello World" chars=($(echo "$txt" | grep -o .)) for char in "${chars[@]}"; do echo "$char" done
grep -o .会把每个字符单独输出一行,再把这些行转换成数组元素,最后循环打印即可。
方法4:用while循环配合read命令
这种方法适合处理长字符串或者管道输入的内容:
txt="Hello World" echo "$txt" | while read -n1 char; do echo "$char" done
read -n1表示每次只读取1个字符,然后打印出来。不过要注意,这种方式会把原字符串里的空格也当成字符输出,如果你想跳过空格,可以在循环里加个判断:if [ "$char" != " " ]; then echo "$char"; fi
现在试试这些方法,都能得到你想要的输出:
H
e
l
l
oW
o
r
l
d
备注:内容来源于stack exchange,提问作者Ashwin Kumar
相关产品推荐
相关产品推荐

