我有一个小的shell脚本,用于测试是否使用if条件登录的条件。
#!/bin/bash
if [ $# -ne 1 ]
then
echo "Argument required"
echo "Usage: on user"
else
user="$1"
if who | grep ^"$user " > /dev/null
then
echo "$user is logged in"
else
echo "$user is not logged in"
fi
fi
这样可以正常工作。
现在这里是我的问题:如果我尝试这个,如果下面的方法条件意味着shell终端通过错误。
if [ who | grep ^"$user " > /dev/null ]
> Error ./user.sh: line 10: [: missing `]'
grep: ]: No such file or directory
你可以告诉一下这两个测试条件之间有什么区别吗?
答案 0 :(得分:2)
简单来说,[
或test
测试表达式的结果,而不是命令列表。
以下是test
和if
的语法:
test expr [expr]
如果列表;然后列出; [elif list;然后列出; ] ... [else list; ] fi
然后在if
构造中,可以跟随命令列表。
因此,在if who | grep ^"$user " > /dev/null
中,它执行命令who | grep ^"$user " > /dev/null
,然后测试命令的返回状态。
但是在if [ who | grep ^"$user " > /dev/null ]
中,它首先执行命令[ who | grep ^"$user " > /dev/null ]
,但是因为|
(管道),它的命令将被解析作为两部分:
1:[ who
,它会抱怨:“第10行:[:缺少`]'”
第二名:grep ^"$user " > /dev/null ]
会抱怨:“grep:]:没有这样的文件或目录”。
至于[
或test
的表达式的格式:
参考The classic test command。主要的四个表达方式是:
文件测试,字符串测试,算术测试, misc测试。
答案 1 :(得分:0)
使用功能。
#!/bin/bash
logged_in () { who | grep ^"$1 " > /dev/null; }
if [ $# -ne 1 ]
then
echo "Argument required"
echo "Usage: on user"
else
user="$1"
if logged_in "$user"
then
echo "$user is logged in"
else
echo "$user is not logged in"
fi
fi