6

我在这里学习教程:http: //bash.cyberciti.biz/guide/If..else..fi#Number_Testing_Script

我的脚本看起来像:

lines=`wc -l $var/customize/script.php`
if test $lines -le 10
then
    echo "script has less than 10 lines"
else
    echo "script has more than 10 lines"
fi

但我的输出看起来像:

./boot.sh: line 33: test: too many arguments
script has more than 10 lines

为什么它说我有太多的争论?我看不出我的脚本与教程中的脚本有何不同。

4

3 回答 3

10

wc -l file命令将打印两个单词。试试这个:

lines=`wc -l file | awk '{print $1}'`

要调试 bash 脚本 (boot.sh),您可以:

$ bash -x ./boot.sh

它将打印执行的每一行。

于 2012-06-12T08:59:19.063 回答
8
wc -l file

输出

1234 file

采用

lines=`wc -l < file`

只获得行数。此外,有些人更喜欢这种表示法而不是反引号:

lines=$(wc -l < file)

另外,由于我们不知道是否$var包含空格,以及文件是否存在:

fn="$var/customize/script.php"
if test ! -f "$fn"
then
    echo file not found: $fn
elif test $(wc -l < "$fn") -le 10
then
    echo less than 11 lines
else
    echo more than 10 lines
fi
于 2012-06-12T09:00:54.897 回答
1

此外,您应该使用

if [[ $lines -gt 10 ]]; then
    something
else
  something
fi

test condition确实过时了,它的直接后继者也是如此[ condition ],主要是因为您必须非常小心这些形式。例如,您必须引用$var传递给testor的任何内容[ ],并且还有其他细节会让人毛骨悚然。(测试在任何方面都被视为任何其他命令)。查看这篇文章了解一些细节。

于 2012-06-12T09:16:28.697 回答