Bash - 测试多个用户

Bash - 测试多个用户

我正在尝试测试当前用户是否是两个允许启动进程的用户之一,但我似乎无法让多条件正常工作:

test ($(whoami) != 'mpurcell' || $(whoami) != 'root')) && (echo "Cannot start script as non-ccast user..."; exit 1)

有没有办法测试多个用户而不必输入两行,如下所示:

test $(whoami) != 'mpurcell' && (echo "Cannot start script as non-ccast user..."; exit 1)
test $(whoami) != 'root' && (echo "Cannot start script as non-ccast user..."; exit 1)

答案1

bash 3.x 及更高版本=~在 [[ 运算符中有一个正则表达式匹配运算符

if [[ ! "$(whoami)" =~ ^(mpurcell|root)$ ]]
then
    echo "Go away" >&2
    exit 1
fi

ETC...

我读到,正则表达式的引用规则在 bash 3.2 左右有所改变。上面的方法适用于我的 3.2.25,如果你的 bash 较旧,则可能需要引用它。

答案2

test只是一个命令,因此它的表达式的解析方式与任何其他命令的参数一样 - 这意味着括号、竖线等必须转义或加引号才能起作用(为了避免出现此问题,test请使用-o而不是||)。如果您实际使用的是 bash,它有一个[[ ]]测试表达式可以避免这些解析异常。

另外,你的表达逻辑不对。如果当前用户不是 mpurcell,则会报告错误或者不是 root;因为当前用户不能同时是 root,所以它总是会出错。我很确定你想要一个那里。

最后,由于括号中有该echo ...; exit 1部分,它将在子 shell 中执行,因此exit命令将退出子 shell,而不是脚本。为了避免这种情况,请使用{ ... }而不是括号。

这是一个 bash 版本:

[[ $(whoami) != 'mpurcell' && $(whoami) != 'root' ]] && { echo "Cannot start script as non-ccast user..."; exit 1; }

这是一个可以在通用 POSIX shell 中运行的版本:

test "$(whoami)" != 'mpurcell' -a "$(whoami)" \!= 'root' && { echo "Cannot start script as non-ccast user..."; exit 1; }

答案3

尝试: [ $(whoami) != 'mpurcell' -a $(whoami) != 'root' ] && (echo "无法以非 ccast 用户身份启动脚本..."; exit 1)

相关内容