如果在shell中声明

时间:2014-03-12 17:30:38

标签: bash shell

我正在创建一个执行文件一定次数的脚本,然后如果文件正确执行,它会生成另一个文件,而这个最后一个文件需要将它存储在一个目录中。示例:我执行它是这样的:./ shell 5 DIR 然后,crpit shell执行另一个名为simulation的文件5次,并在每次正确执行文件模拟时创建一个目录和一个输出文件。 问题是,我必须为他们执行文件时发送的参数添加一个if语句,我不知道如何,这是我的代码:

#!/bin/bash

if [ $# == 3 || $# == 2 ]; then
    c=0
    i=0
    e=0
    cont=0
    while [ $c -le $0 ]
    do
            ./simula cont RES
        e = $?
        if[ e == 0 ]; then
            if[ $# == 3 ]; then
                chmod RES $2
            mkdir $1$c
            mv RES $1$c/.
            (( c++ ))
        else
            (( i++ ))
        (( cont++ ))
    done
    echo Shan generat $c simulacions correctes.
    echo Hi ha hagut $i simulacions erronies.        
else 
    echo Nombre de parametres incorrecte: $#.
fi

所以我在执行名为shell的文件时必须有2个或3个参数,这就是为什么我有这个,如果在第二行代码,但它不断给我一个错误:

./shell: line 12: syntax error near unexpected token `then'
./shell: line 12: `             if[ e == 0 ]; then'

我是脚本的新手,我不知道我做错了什么,有什么线索吗?

3 个答案:

答案 0 :(得分:2)

间距在shell脚本中非常重要,它与编程语言不同 if(x>y)if ( x > y )是一回事。

特别是,if[是两个不同的命令:
if[ e == 0 ]必须为if [ e == 0 ]

更准确地说,if是一个shell 关键字thenelsefi

[是shell 内置或外部程序(或两者),具体取决于您的shell,并且是test的别名。您可以使用whichtype命令找到更多信息。

$ type [
[ is a shell builtin
$ which [
/bin/[
$ type fi
fi is a shell keyword
$ which fi
$

答案 1 :(得分:0)

如果您尝试if [ $e == 0 ];而不是if[ e == 0 ];

,它是否有效

答案 2 :(得分:0)

在分配变量时,Bash不允许在=符号之间留出空格,就像在其他语言中一样。

必须有一个空格分隔保留字,如if

所以if [ $# == 3 ]if[ $# == 3 ]不存在的情况下有效。

在Bash中,当您在变量分配后调用变量时,在变量名称前使用$非常重要。

因此[ e == 0 ]会测试文字字符串e是否与字符串0相同。要测试分配给变量e的字符串是否与字符串0相同,请使用[ $e == 0 ]

test整数时,您可以使用-eq代替==。有关详细信息,请参阅man test

此外,$0会扩展为脚本文件的名称,因此,如果脚本名称不是while,则“0循环将永远不会结束,因为脚本名称将会在脚本运行时不要更改。