如何剪切并将字符串分配给for循环内的动态数组

时间:2015-08-07 10:34:13

标签: bash shell unix

这是我为执行此功能所做的工作,但我没有得到我想要的东西。

#!/bin/sh
DIRECTIONPART1=4-7-9 

for (( i=1; i<=3; i++ )) 
do 
x=`echo $DIRECTIONPART1| awk -F'-' '{print $i}'` 
myarray[$i]=$x 

done

for (( c=1; c<=3; c++ )) 
do 
echo ${myarray[$c]} 
done

我们在此步骤中意识到的问题

x=`echo $DIRECTIONPART1| awk -F'-' '{print $i}'` 

请帮助我获得结果

这就是我得到的:

4-7-9 
4-7-9
4-7-9

但我想要这个: 4 7 9

4 个答案:

答案 0 :(得分:0)

你是对的问题。问题是您无法在$i中使用print作为变量。我尝试了一些对我有用的解决方法:

x=`echo $DIRECTIONPART1| awk -F '-' -v var=$i '{print $var }'`

总之看起来像:

#!/bin/sh
DIRECTIONPART1=4-7-9

for (( i=1; i<=3; i++ ))
do
x=`echo $DIRECTIONPART1| awk -F '-' -v var=$i '{print $var }'`
myarray[$i]=$x
done

for (( c=1; c<=3; c++ ))
do
echo ${myarray[$c]}
done

预期输出:

# sh test.sh
4
7
9
#

答案 1 :(得分:0)

获得所需输出的最简单的可移植方法是使用$IFS(在子shell中):

#!/bin/sh
DIRECTIONPART1=4-7-9
(IFS=- && echo $DIRECTIONPART1)

shell数组不能移植,因为POSIX,ksh和bash不能 同意阵列。 POSIX没有; ksh和bash使用不同的语法。

如果你真的想要一个数组,我建议你在中完成整个事情:

#!/bin/sh
DIRECTIONPART1=4-7-9

awk -v v=${DIRECTIONPART1} 'BEGIN {
  n=split(v,a,"-")
  for (i=1;i<=n;i++) {
    print a[i]
  }
}'

这将为字符串中的每个值生成一行:

4
7
9

如果您想要数组,请删除#!/bin/sh,并执行以下操作:

#!/bin/bash
DIRECTIONPART1=4-7-9
A=( $(IFS=- && echo $DIRECTIONPART1) )

for ((i=0;i<=${#A[@]};i++))
do
  echo ${A[i]}
done

答案 2 :(得分:0)

多次,甚至一次调用awk不是正确的做法。使用bash内置read填充数组。

# Note that the quotes here are only necessary to
# work around a bug that was fixed in bash 4.3. It
# doesn't hurt to use them in any version, though.
$ IFS=- read -a myarray <<< "$DIRECTIONPART_1"
$ printf '%s\n' "${myarray[@]}"
4
7
9

答案 3 :(得分:0)

[akshay@localhost tmp]$ bash test.sh
#!/usr/bin/env bash

DIRECTIONPART1=4-7-9

# Create array
IFS='-' read -a array <<< "$DIRECTIONPART1"

#To access an individual element:
echo "${array[0]}"

#To iterate over the elements:
for element in "${array[@]}"
do
    echo "$element"
done

#To get both the index and the value:
for index in "${!array[@]}"
do
    echo "$index ${array[index]}"
done

<强>输出

[akshay@localhost tmp]$ bash test.sh
4
4
7
9
0 4
1 7
2 9

[akshay@localhost tmp]$ cat test1.sh
#!/usr/bin/env bash

DIRECTIONPART1=4-7-9

array=(${DIRECTIONPART1//-/ })
for index in "${!array[@]}"
do
    echo "$index ${array[index]}"
done

<强>输出

[akshay@localhost tmp]$ bash test1.sh
0 4
1 7
2 9