bash:逐个字符从字符串中读取文本

3
我有一个脚本,可以每次读取一个字符的文件。这是我使用的脚本。
INPUT=/path/
while IFS= read -r -n1 char; do
    echo $char
done < "$INPUT"

它能正常工作,但我无法找出如何将每个字符存储到变量中。 我正在寻找类似于

N$X=$char

其中X=字符计数,$char=字符

任何帮助都将不胜感激。谢谢!

2个回答

4
作为一般性的事情,在中使用像N1N2等变量,并希望像N$i这样通过另一个变量i来访问它们是非常糟糕的。解决这个问题的方法在于使用数组。以下是我使用数组来解决您的问题的方式:
n=()
i=0
while read -r -n1 n[i]; do
    echo "Character $i is ${n[i]}"
    ((++i))
done < "$INPUT"

此时,您已经将字符存储在数组n中(并非全部字符)。您可以通过以下方式访问第k+1个字符:

${n[k]}

(请记住,数组索引从0开始)。


另一种可能性是将所有内容读入字符串中,操作非常简单,只需执行以下操作:
string=$( < "$INPUT" )

你可以通过以下方式访问字符k+1:

${n:k:1}

(从索引k开始取长度为1的子字符串)。可以通过循环遍历所有字符来完成:

for ((k=0;k<${#string};++k)); do
    echo "Character $k is '${string:k:1}'"
done

2
您可以像这样做:

您可以采取以下步骤:

X=0
while IFS= read -r -n1 char; do
    eval "N$X=\$char"
    X=`expr $X + 1`
done < "$INPUT"

在循环结束时,X0X1X2等将包含已读取的各个字符。

当输入文件包含空格时,这不会失败吗? - ruakh
@ruakh 不是的。我用空格检查过了,它可以正常工作。请注意,在实际赋值被评估之前,eval中的$char不会被展开,因为在美元符号前有一个反斜杠。 - James Holderness
@JamesHolderness:是的,我注意到了,但是...哦,我明白了。我总是忘记在赋值语句的右侧不会发生单词拆分。 - ruakh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接