在 shell 脚本中为 for 循环中的变量赋值

Assigning value to a variable in for loop in shell scripting

我正在尝试使用以下方法从单词中拆分字母并在新行中打印它们。但是我无法为变量赋值。如果我在这里遗漏了任何基本规则,请纠正我。

stringOneLength=$(echo `expr length `)
echo $stringOneLength
stringTwoLength=$(echo `expr length `)

echo $stringTwoLength


for ((i=1; i<=$stringTwoLength; i++)) ;
do
    x$i=$(echo "" | sed 's/\(.\{1\}\)/ /g' | sed 's/\(.\{1\}\)/ /g' |awk '{print $i}')

    echo x$i
done

出现以下错误:

sh FileName one two
3
3
samp: line 13: x1=o: command not found
x1
samp: line 13: x2=o: command not found
x2
samp: line 13: x3=o: command not found
x3

我的方法有什么问题,我该如何修正我的变量赋值?

您似乎在尝试使用 $i 动态创建变量名。首先,如果可能的话,我建议不要这样做——如果您的 shell 支持,最好使用数组。但是,可以使用 eval:

来完成
eval x$i=$( ... )

使用 eval$i 在赋值发生之前展开。

使用 bash,还有 declare,您可以使用它来代替 eval。它比 eval 享有更好的声誉,因为它更安全。但是,如果您使用的是 bash,则可以(并且应该)改用数组:

x=() # before the loop
x[i]=$( ... )

还值得一提的是,如果您实际上不需要单独存储每个值(即您不打算以后使用它们),您可以完全删除 $i 并执行循环中的简单赋值:

x=$( ... )