如何在bash中拆分字符串

时间:2017-10-28 02:13:32

标签: linux bash shell

说我有一串

samp_str="ABCDEF"

我想把它们分成像

这样的字符
var1=A
var2=B
var3=C
var4=D
var5=E
var6=F

我该怎么做?

4 个答案:

答案 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