说我有一串
samp_str="ABCDEF"
我想把它们分成像
这样的字符var1=A
var2=B
var3=C
var4=D
var5=E
var6=F
我该怎么做?
答案 0 :(得分:2)
关于我能想到的唯一方法是在bash>中将每个字符与var0, var1, ...
之类的引用相关联并存储起来。 4将使用关联数组。如果您只想打印标签var0, var1, ...
旁边的值,那么您不必担心存储任何内容,只需将var
分成字符,然后echo
标签每个角色。
如果你不在乎给每个角色提供任何类型的名字,那么正常的索引数组作为Darby_Crash提供了一个例子,他的回答很好。它实际上没那么费力,但索引将是你所有的。
但是,如果您的目的是为了能够存储单个字符以供以后使用,然后使用名称来引用字符,那么这就是关联数组要提供的内容。
例如,您可以使用declare -A varname
声明和关联数组。然后,您可以使用键,例如由var#
组成的字符串来存储该字符(例如varname[var#]=char
)。然后,您可以通过提供var#
是正常数组语法中的键(索引)来检索字符(例如echo "var#=${varname[var#]}"
)来引用每个字符。在您的情况下,例如:
declare -A a ## declare associative array
var="ABCDEF"
for ((i = 0; i < ${#var}-1; i++)); do ## loop over each char
a[var$i]=${var:i:1} ## assign under index 'var$i'
done
## output values saved in a
for ((i = 0; i < ${#var}; i++)); do
echo "var$i=${a[var$i]}"
done
示例使用/输出
$ (
> declare -A a ## declare associative array
> var="ABCDEF"
> for ((i = 0; i < ${#var}; i++)); do ## loop over each char
> a[var$i]=${var:i:1} ## assign under index 'var$i'
> done
>
> ## output values saved in a
> for ((i = 0; i < ${#var}; i++)); do
> echo "var$i=${a[var$i]}"
> done
> )
var0=A
var1=B
var2=C
var3=D
var4=E
var5=F
注意:虽然可以使用for key in ${!varname[@]}; do
迭代关联数组,但不会保留任何类型的排序顺序(关联数组未排序) 。上面,由于您的引用是由var#
组成的,因此只需循环遍历每个#
并使用派生密钥可以保留排序顺序。当然,以这种方式实现索引数组的好处显然很小。
查看所有答案,如果您有任何疑问,请与我们联系。
答案 1 :(得分:0)
这是我的解决方案
string='ABCDEF'
for ((i=1;i<=${#string};i++)); do eval "var$i=\"${string:$((i-1)):1}\""; done
<强>输出强>
darby@Debian:~/Scrivania$ echo $var1
A
darby@Debian:~/Scrivania$ echo $var2
B
darby@Debian:~/Scrivania$
或者您可以使用数组(是更好的方法)
string='ABCDEF'
for ((i=0;i<=${#string};i++)); do var[$i]="${string:i:1}"; done
<强>输出强>
darby@Debian:~/Scrivania$ echo "${var[0]}"
A
darby@Debian:~/Scrivania$ echo "${var[1]}"
B
darby@Debian:~/Scrivania$
答案 2 :(得分:0)
这样的事情应该为你做。你不必担心字符串的含义。它是使用此语法${#var}
计算的,您需要使数组以${#var} - 1
结尾。 lemme知道是否有任何事情:)
$ var="ABCDEF" ; for i in $(seq 0 $((${#var} - 1 )) ) ; do echo var${i}=${var:${i}:1} ; done
输出以下内容:
echo var0=A
echo var1=B
echo var2=C
echo var3=D
echo var4=E
echo var5=F
答案 3 :(得分:0)
另一种方式
samp_str="ABCDEF"
var+=
while read -n 1 c; do
var+=("$c")
done<<<$samp_str
unset var[-1]
unset var[0]
for i in ${!var[*]} ; do
echo var[$i] = ${var[$i]}
done