这就是我为了执行这个功能所做的,但我没有得到我想要的东西。
#!/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但我想要的是:479
发布于 2015-08-07 19:26:10
你的问题路线是对的。问题是你不能在print中使用$i作为变量。我尝试了一些对我有效的变通方法:
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
#发布于 2015-08-07 19:27:11
获得所需输出的最简单的可移植方法是使用$IFS (在子subshell中):
#!/bin/sh
DIRECTIONPART1=4-7-9
(IFS=- && echo $DIRECTIONPART1)shell数组不能移植,因为POSIX、ksh和bash在数组上不一致。POSIX没有;ksh和bash使用不同的语法。
如果你真的想要一个数组,我建议用awk来做所有的事情
#!/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如果您想要bash阵列,请删除#!/bin/sh,然后执行以下操作:
#!/bin/bash
DIRECTIONPART1=4-7-9
A=( $(IFS=- && echo $DIRECTIONPART1) )
for ((i=0;i<=${#A[@]};i++))
do
echo ${A[i]}
done发布于 2015-08-07 19:38:10
多次甚至一次调用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
9https://stackoverflow.com/questions/31875655
复制相似问题