通过tcsh执行IF语句时遇到问题。这对我来说很好 -
#!/bin/bash
if echo `cal|tail -6|sed -e 's/^.{3}//' -e 's/.{3}$//' |tr -s '[:blank:]' 'n' | head -11|tail -10|tr -s 'n' ' '`|grep -w `date "+%e"`
then
echo "present"
else
echo "absent"
fi
这就是问题所在——
#!/bin/tcsh
if echo `cal|tail -6|sed -e 's/^.{3}//' -e 's/.{3}$//' |tr -s '[:blank:]' 'n' | head -11|tail -10|tr -s 'n' ' '`|grep -w `date "+%e"`
then
echo "present"
else
echo "absent"
endif
收到此错误-
if: Expression Syntax.
then: Command not found.
我真的需要它来使用"tcsh"运行
首先,你必须知道你可以找到两个不同的shell族,如:
- 伯恩型贝壳(Bash,zsh...)
- C 语法类型 shell (tcsh, csh...)
如您所见,Bash 和 tcsh 并非来自同一个 shell 家族。因此,在 tcsh 上,if 语句与 bash 语句略有不同。在您的情况下,关键字"then"放错了位置。尝试将其放在"if"行的末尾,如下所示:
#!/bin/tcsh
if(echo `cal|tail -6|sed -e 's/^.{3}//' -e 's/.{3}$//'
|tr -s '[:blank:]' 'n' | head -11|tail -10|tr -s 'n' ' '`|
grep -w `date "+%e"`) then
echo "present"
else
echo "absent"
endif
希望对您有所帮助。
在bash
中有效,因为 POSIX 样式的 shell 中的if
语句总是通过执行命令来工作(碰巧[
是test
命令的别名)。
但是,tcsh
中的if
语句不是这样工作的。 它们有自己的语法(在tcsh
手册页的"表达式"下进行了描述)。
尝试自行运行管道,然后在if
中检查退出状态:
cal | tail -6 | sed -e 's/^.{3}//' -e 's/.{3}$//' | tr -s '[:blank:]' 'n' | head -11 | tail -10 | tr -s 'n' ' ' | grep -w `date "+%e"` >/dev/null
if ( $? == 0 ) then
echo "present"
else
echo "absent"
endif
我通常会做这样的事情,保持条件语句简单。但是,您可以将变量塞入"if"中,然后检查您的 grep 是否为空。
set present = `tail -6 .... | grep “”`
if ( $present != “” ) then
echo “present”
else
echo “not present”
endif
你也可以使用 "-x" 来帮助调试 #!/bin/tcsh -x。 这么小的东西,一个检查变量的回显应该可以做到,但"-x"可能会给你你需要的所有信息。