我对 bash 的语法很陌生,我的“.bash_aliases”文件中有一段代码。它要么获取一个整数作为参数,要么获取字母“c”,当它获取一个整数时,它将该整数放入环境变量中,网络服务器可以将其用作端口。当它输入字母“c”时,它会清除变量。
当我尝试使用整数运行命令时,出现错误
main@linuxWSL:~$ serverp 2000
-bash: [: missing `]'
2000: command not found
当我尝试使用字母“c”时,我得到了
main@linuxWSL:~$ serverp c
-bash: [: missing `]'
c: command not found
这是我的 bash 代码:
serverp () {
if [ "$1" = "clear" || "$1" = "c" ]
then
unset PORT
echo -e "\e$CLEAR$GREEN""mWebServer port has been reset!""$CLEAN"
return 0
fi
export PORT="$1"
}
有人能帮我吗?谢谢!?
[
不是 Bash 中的关键字,它会使 shell 解析器以不同的方式解释命令行的其余部分。[
是一个类似cat
or的命令echo
。[
(likeecho
) 是 Bash 中的内置函数,但这仅意味着它可以在不产生额外进程的情况下运行,它的行为仍然像一个命令。并且要明确:
[ … ]
不是if … then …
语法的一部分。if
只是测试一些代码的退出状态:if true; then …
有效,if sleep 5; then …
有效,同样if [ … ]; then …
有效(如果该[ … ]
部分本身是有效命令)。您的系统中可能有一个
[
可执行文件。试试type -a [
。比较type -a [[
。相反,[
,[[
是 Bash 中的一个关键字,它确实使解析器在 和 之间[[
进行]]
特殊处理。[
不是关键字。正确编写[ … ]
的是一个命令,其中]
只是最后一个参数。[
requires]
作为最后一个参数,否则它拒绝工作。这只是为了[ … ]
突出一个块,就好像它是一些特殊的语法一样;但这不是特殊的语法。你
[ "$1" = "clear" || "$1" = "c" ]
被 shell 解释为[ "$1" = "clear"
并"$1" = "c" ]
与||
. 所以有两个命令。第一个命令是[ "$1" = "clear"
,[
被执行,它没有]
作为最后一个参数,它抱怨并以非零退出状态退出。由于非零状态和||
,shell 尝试运行以任何"$1"
扩展为开头的第二个命令。这样,脚本的第一个参数被解释为要运行的可执行文件。像这样修复你
[ … || … ]
:此代码段包含两个有效
[
命令。它应该做你想做的事。注意
[[ "$1" = "clear" || "$1" = "c" ]]
是一段工作代码,而[ "$1" = "clear" || "$1" = "c" ]
不是。这是因为[[
不是命令。它是一个关键字,它使 shell 解析器]]
特别对待所有内容;这包括||
.[[
和之间还有其他区别[
,不要盲目互换。Bash 中的
[
内置支持-o
for or(和-a
for and),所以这也可以工作:这是您的代码,其中
||
(shell 特殊)被替换为-o
(shell 不特殊)。你应该避免-o
。从这篇文章:请注意,文章详细说明了
-a
,因此“&&
改为运算符”。在你的情况下,它分别是-o
和||
。由操作员分隔的两个测试||
正是我们的解决方案。是
if [ "$1" = "clear" ] || [ "$1" = "c" ]
。