我是shell脚本的新手,并创建了一个脚本来检查参数是否通过if else条件传递。但它总是在意外令牌“fi”'
附近发出错误'语法错误是否总是需要在条件括号后使用';' 我在http://www.compileonline.com/execute_bash_online.php上在线运行它运行良好但不在我的系统上(Centos 6.2)。我在env设置中遗漏了什么,或者是其他东西。
代码
#!/bin/bash
echo "print a message"
if [ $# -eq 1 ]; then
echo "Argument are passed to shell script"
else
echo "No arguments are passed to shell script"
fi
错误消息
[root@local shell_scripts]# sh test.sh 12 13
test.sh: line 7: syntax error near unexpected token `fi'
test.sh: line 7: `fi'
[root@local shell_scripts]#
我的详细信息
[root@local shell_scripts]# env
SHELL=/bin/bash
TERM=xterm
HISTSIZE=1000
SSH_CLIENT=192.168.1.17 49656 22
PERL5LIB=/home/bharat/perl5/lib/perl5/x86_64-linux-thread-multi:/home/bharat/perl5/lib/perl5
PERL_MB_OPT=--install_base /home/bharat/perl5
SSH_TTY=/dev/pts/6
USER=bharat
PATH=/home/bharat/perl5/bin:/usr/kerberos/sbin:/home/bharat/perl5/bin:/usr/kerberos/bin:/usr/local/bin:/bin:/usr/bin:/home/bharat/bin
MAIL=/var/spool/mail/bharat
INPUTRC=/etc/inputrc
LANG=en_US.UTF-8
SSH_ASKPASS=/usr/libexec/openssh/gnome-ssh-askpass
HOME=/root
SHLVL=4
PERL_LOCAL_LIB_ROOT=/home/bharat/perl5
LOGNAME=bharat
CVS_RSH=ssh
LESSOPEN=|/usr/bin/lesspipe.sh %s
G_BROKEN_FILENAMES=1
PERL_MM_OPT=INSTALL_BASE=/home/bharat/perl5
_=/bin/env
[root@local shell_scripts]#
答案 0 :(得分:3)
回答您的第一个问题:;
条件后不需要if
。从语法上讲,then
应该单独行。如果then
位于第1行,则使用;
。以下代码是正确的:
if [ $# -eq 1 ]
then
echo ok
fi
此外,这些括号实际上不是if
条件括号。如果condition是任何有效的bash命令,并且括号等同于test
,请参阅man test
以获取参考。
以下是有效的if
语句开头:
if cp a.txt b.txt ; then ...
if test $# -eq 1 ; then ...
第二个等同于您的if
声明。
答案 1 :(得分:1)
适合我:
$ cat > f.sh
#!/bin/bash
echo "print a message"
if [ $# -eq 1 ]; then
echo "Argument are passed to shell script"
else
echo "No arguments are passed to shell script"
fi
$ bash f.sh
print a message
No arguments are passed to shell script