sh/bash if else声明

abi*_*964 8 linux bash shell

我想理解脚本中的if else陈述sh

所以我写了下面的内容,看看是否在环境中设置JAVA_HOME,我编写了下面的脚本

#!/bin/sh
if [ $JAVA_HOME != "" ]
then
    echo $JAVA_HOME
else
    echo "NO JAVA HOME SET"
fi
Run Code Online (Sandbox Code Playgroud)

这是我的输出 env

sh-3.2$ env

SHELL=/bin/csh
TERM=xterm
HOST=estilor
SSH_CLIENT=10.15.16.28 4348 22
SSH_TTY=/dev/pts/18
USER=asimonraj
GROUP=ccusers
HOSTTYPE=x86_64-linux
PATH=/usr/local/bin:/bin:/home/asimonraj/java/LINUXJAVA/java/bin:/usr/bin
MAIL=/var/mail/asimonraj
PWD=/home/asimonraj/nix
HOME=/home/asimonraj
SHLVL=10
OSTYPE=linux
VENDOR=unknown
LOGNAME=asimonraj
MACHTYPE=x86_64
SSH_CONNECTION=100.65.116.248 4348 100.65.116.127 22
_=/bin/env
Run Code Online (Sandbox Code Playgroud)

但我得到低于输出

sh-3.2$ ./test.sh
./test.sh: line 3: [: !=: unary operator expected
NO JAVA HOME SET
Run Code Online (Sandbox Code Playgroud)

dus*_*uff 15

你正在遇到sh扩展参数的方式的愚蠢限制.您的脚本的第3行正在扩展为:

if [ != ]
Run Code Online (Sandbox Code Playgroud)

哪个sh无法弄清楚该怎么做.尝试这个令人讨厌的黑客大小:

if [ x$JAVA_HOME != x ]
Run Code Online (Sandbox Code Playgroud)

两个参数都必须是非空的,所以我们只是将x它们放入其中,看看会发生什么.

或者,如果字符串非空,则有一个单独的运算符用于测试:

if [ !-z $JAVA_HOME ]
Run Code Online (Sandbox Code Playgroud)

(-z测试以下字符串是否为空.)

  • `if ["$ JAVA_HOME"!=""]`也应该有效. (9认同)