我正在创建一个执行文件一定次数的脚本,然后如果文件正确执行,它会生成另一个文件,而这个最后一个文件需要将它存储在一个目录中。示例:我执行它是这样的:./ 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'
我是脚本的新手,我不知道我做错了什么,有什么线索吗?
答案 0 :(得分:2)
间距在shell脚本中非常重要,它与编程语言不同
if(x>y)
和if ( x > y )
是一回事。
特别是,if
和[
是两个不同的命令:
if[ e == 0 ]
必须为if [ e == 0 ]
更准确地说,if
是一个shell 关键字,then
,else
和fi
[
是shell 内置或外部程序(或两者),具体取决于您的shell,并且是test
的别名。您可以使用which
和type
命令找到更多信息。
$ 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
循环将永远不会结束,因为脚本名称将会在脚本运行时不要更改。