2013-05-10 72 views
0

我有运行为下面的脚本:化妆用户输入循环变量

>> bash test.sh < 0 0 

内test.sh

read $sni 
read $snf 

echo 'Run between '$sni' and '$snf 
for i in {sni..snf} 
do 

done 

,但我得到了以下错误:

test.sh: line 14: [: {sni..snf}: integer expression expected 
test.sh: line 19: [: {sni..snf}: integer expression expected 

如何制作循环变量整数?谢谢。

+0

另外,你应该使用'read sni',因为你*不需要在那里插入可变插值。 – jpaugh 2013-05-10 22:35:22

+1

@jpaugh广告1)可悲的是,你不能。如果你想在这里使用变量,你必须使用'seq'(无论如何都使用'bash')。 – 2013-05-10 22:39:36

+0

哎唷!哇!你是对的。 – jpaugh 2013-05-10 22:42:04

回答

1

OK,总结了各种输入的情况下,你要坚持你的for语法。

read $sni 

这是间接的。你是不是读入变量${sni}但进入其名称由${sni}举行的变量,例如:

$ foo=bar 
$ read $foo <<< "quux" 
$ echo "${foo}" 
bar 
$ echo "${bar}" 
quux 

所以这应该是

read sni 

代替。关于...

for i in {sni..snf} 

...这不起作用,因为您不是将变量视为变量。 如果使用ksh那么你可以做

for i in {${sni}..${snf}}; do 
    ... 
done 

bash不是那么聪明的你想使用

for i in $(seq ${sni} ${snf}); do 
    ... 
done 

所以整个事情应该看起来更像是这种情况:

#!/bin/sh 

read sni 
read snf 

echo "Run between '${sni}' and '${snf}'" 
for i in $(seq ${sni} ${snf}); do 
     echo "i=$i" 
done 

示例:

$ printf "1\n4\n" | ./t.sh 
Run between '1' and '4' 
i=1 
i=2 
i=3 
i=4 
1

您可以使用类似这样

for ((i=$sni ; i<=$snf ; i++)) 

从bash的帮助

((...)): ((expression)) 
    Evaluate arithmetic expression. 

    The EXPRESSION is evaluated according to the rules for arithmetic 
    evaluation. Equivalent to "let EXPRESSION". 

    Exit Status: 
    Returns 1 if EXPRESSION evaluates to 0; returns 0 otherwise. 

你也可以传递变量shell脚本作为命令的参数。

bash test.sh 1 2 

的将被包含在变量$1$2

1
#!/bin/sh 
if [[ ! $2 ]] 
then 
    echo test.sh SNI SNF 
    exit 
fi 

echo "Run between $1 and $2" 
seq $1 $2 | while read i 
do 
    # do stuff 
done