Tomcat 的啟動文件 catalina.sh shell腳本詳解


接上一篇文章:我們啟動tomcat下的start.sh文件,shell腳本到底做了什么呢?在上一篇文章最后,start.sh 最終調用了 catalina.sh 腳本(調用命令為:exec /usr/local/apache-tomcat-9.0.21/bin/catalina.sh start "$@");那么catalina.sh 具體干了什么呢?

代碼塊:

# OS specific support.  $var _must_ be set to either true or false.
cygwin=false
darwin=false
os400=false
hpux=false
case "`uname`" in
CYGWIN*) cygwin=true;;
Darwin*) darwin=true;;
OS400*) os400=true;;
HP-UX*) hpux=true;;
esac

resolve links - $0 may be a softlink

PRG="$0"

while [ -h "$PRG" ]; do
ls=ls -ld "$PRG"
link=expr "$ls" : '.*-> \(.*\)$'
if expr "$link" : '/.*' > /dev/null; then
PRG="$link"
else
PRG=dirname "$PRG"/"$link"
fi
done

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24

上述這一段代碼,設定了一些變量, 並通過case判斷根據服務器操作系統的不同,設置不同的參數值。通過while循環判斷,獲取catalina.sh的絕對路徑(非鏈接),賦值給PRG。在服務器上執行unameLinux。比如我的tomcat的catalina.sh的絕對路徑為/usr/local/apache-tomcat-9.0.21/bin/catalina.sh。此時,變量情況為:

cygwin=false
darwin=false
os400=false
hpux=false
PRG=/usr/local/apache-tomcat-9.0.21/bin/catalina.sh

    
    
   
   
           
   
   
  
  
          
  • 1
  • 2
  • 3
  • 4
  • 5

代碼塊:

# Only set CATALINA_HOME if not already set
[ -z "$CATALINA_HOME" ] && CATALINA_HOME=`cd "$PRGDIR/.." >/dev/null; pwd`

Copy CATALINA_BASE from CATALINA_HOME if not already set

[ -z "$CATALINA_BASE" ] && CATALINA_BASE="$CATALINA_HOME"

Ensure that any user defined CLASSPATH variables are not used on startup,

but allow them to be specified in setenv.sh, in rare case when it is needed.

CLASSPATH=

if [ -r "$CATALINA_BASE/bin/setenv.sh" ]; then
. "$CATALINA_BASE/bin/setenv.sh"
elif [ -r "$CATALINA_HOME/bin/setenv.sh" ]; then
. "$CATALINA_HOME/bin/setenv.sh"
fi

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

上述代碼,通過-z判斷變量CATALINA_HOMECATALINA_BASE是否已經設置;若未設置,則設定默認值。默認情況下,bin目錄下默認是沒有setenv.sh文件。所以上述代碼執行后,變量變動情況如下:

PRGDIR=/usr/local/apache-tomcat-9.0.21/bin
CATALINA_HOME=/usr/local/apache-tomcat-9.0.21
CATALINA_BASE=/usr/local/apache-tomcat-9.0.21
CLASSPATH=

    
    
   
   
           
   
   
  
  
          
  • 1
  • 2
  • 3
  • 4

代碼塊:

# For Cygwin, ensure paths are in UNIX format before anything is touched
if $cygwin; then
  [ -n "$JAVA_HOME" ] && JAVA_HOME=`cygpath --unix "$JAVA_HOME"`
  [ -n "$JRE_HOME" ] && JRE_HOME=`cygpath --unix "$JRE_HOME"`
  [ -n "$CATALINA_HOME" ] && CATALINA_HOME=`cygpath --unix "$CATALINA_HOME"`
  [ -n "$CATALINA_BASE" ] && CATALINA_BASE=`cygpath --unix "$CATALINA_BASE"`
  [ -n "$CLASSPATH" ] && CLASSPATH=`cygpath --path --unix "$CLASSPATH"`
fi

Ensure that neither CATALINA_HOME nor CATALINA_BASE contains a colon

as this is used as the separator in the classpath and Java provides no

mechanism for escaping if the same character appears in the path.

case $CATALINA_HOME in
:) echo "Using CATALINA_HOME: $CATALINA_HOME";
echo "Unable to start as CATALINA_HOME contains a colon (😃 character";
exit 1;
esac
case $CATALINA_BASE in
:) echo "Using CATALINA_BASE: $CATALINA_BASE";
echo "Unable to start as CATALINA_BASE contains a colon (😃 character";
exit 1;
esac

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23

上述代碼,由於$cygwin=false,跳過if判斷。接下來兩個case通過$CATALINA_HOME與$CATALINA_BASE的值是否包含判斷服務器是否設置了環境變量。若系統設置的環境變量,會給出提示,並退出執行腳本。由於服務器沒有CATALINA的環境變量設置,故此時無變量變化。
代碼塊:

# For OS400
if $os400; then
  # Set job priority to standard for interactive (interactive - 6) by using
  # the interactive priority - 6, the helper threads that respond to requests
  # will be running at the same priority as interactive jobs.
  COMMAND='chgjob job('$JOBNAME') runpty(6)'
  system $COMMAND

Enable multi threading

export QIBM_MULTI_THREADED=Y
fi

Get standard Java environment variables

if $os400; then

-r will Only work on the os400 if the files are:

1. owned by the user

2. owned by the PRIMARY group of the user

this will not work if the user belongs in secondary groups

. "$CATALINA_HOME"/bin/setclasspath.sh
else
if [ -r "$CATALINA_HOME"/bin/setclasspath.sh ]; then
. "$CATALINA_HOME"/bin/setclasspath.sh
else
echo "Cannot find $CATALINA_HOME/bin/setclasspath.sh"
echo "This file is needed to run this program"
exit 1
fi
fi

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28

由於$os400=false,所以第一段if...else...跳過,第二段if...else...進入else 。當setclasspath.sh文件可讀時,執行該文件,否則給出提示,並退出腳本。
注:關於setclasspath.sh到底在干嘛,我們下次再詳述。 此時變量無變化。
代碼塊:

# Add on extra jar files to CLASSPATH
if [ ! -z "$CLASSPATH" ] ; then
  CLASSPATH="$CLASSPATH":
fi
CLASSPATH="$CLASSPATH""$CATALINA_HOME"/bin/bootstrap.jar

if [ -z "$CATALINA_OUT" ] ; then
CATALINA_OUT="$CATALINA_BASE"/logs/catalina.out
fi

if [ -z "$CATALINA_TMPDIR" ] ; then

Define the java.io.tmpdir to use for Catalina

CATALINA_TMPDIR="$CATALINA_BASE"/temp
fi

Add tomcat-juli.jar to classpath

tomcat-juli.jar can be over-ridden per instance

if [ -r "$CATALINA_BASE/bin/tomcat-juli.jar" ] ; then
CLASSPATH=$CLASSPATH:$CATALINA_BASE/bin/tomcat-juli.jar
else
CLASSPATH=$CLASSPATH:$CATALINA_HOME/bin/tomcat-juli.jar
fi

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22

上述代碼,對一些變量進行簡單的判斷,根據情況賦值,此時變量變化情況為:

CLASSPATH= --> /usr/local/apache-tomcat-9.0.21/bin/bootstrap.jar
CATALINA_OUT=/usr/local/apache-tomcat-9.0.21/logs/catalina.out
CATALINA_TMPDIR=/usr/local/apache-tomcat-9.0.21/temp
CLASSPATH=/usr/local/apache-tomcat-9.0.21/bin/bootstrap.jar --> /usr/local/apache-tomcat-9.0.21/bin/bootstrap.jar:/usr/local/apache-tomcat-9.0.21/bin/tomcat-juli.jar

    
    
   
   
           
   
   
  
  
          
  • 1
  • 2
  • 3
  • 4

代碼塊:

# Bugzilla 37848: When no TTY is available, don't output to console
have_tty=0
if [ -t 1 ]; then
    have_tty=1
fi

For Cygwin, switch paths to Windows format before running java

if $cygwin; then
JAVA_HOME=cygpath --absolute --windows "$JAVA_HOME"
JRE_HOME=cygpath --absolute --windows "$JRE_HOME"
CATALINA_HOME=cygpath --absolute --windows "$CATALINA_HOME"
CATALINA_BASE=cygpath --absolute --windows "$CATALINA_BASE"
CATALINA_TMPDIR=cygpath --absolute --windows "$CATALINA_TMPDIR"
CLASSPATH=cygpath --path --windows "$CLASSPATH"
[ -n "$JAVA_ENDORSED_DIRS" ] && JAVA_ENDORSED_DIRS=cygpath --path --windows "$JAVA_ENDORSED_DIRS"
fi

if [ -z "$JSSE_OPTS" ] ; then
JSSE_OPTS="-Djdk.tls.ephemeralDHKeySize=2048"
fi
JAVA_OPTS="$JAVA_OPTS $JSSE_OPTS"

Register custom URL handlers

Do this here so custom URL handles (specifically 'war:...') can be used in the security policy

JAVA_OPTS="$JAVA_OPTS -Djava.protocol.handler.pkgs=org.apache.catalina.webresources"

Set juli LogManager config file if it is present and an override has not been issued

if [ -z "$LOGGING_CONFIG" ]; then
if [ -r "$CATALINA_BASE"/conf/logging.properties ]; then
LOGGING_CONFIG="-Djava.util.logging.config.file=$CATALINA_BASE/conf/logging.properties"
else
# Bugzilla 45585
LOGGING_CONFIG="-Dnop"
fi
fi

if [ -z "$LOGGING_MANAGER" ]; then
LOGGING_MANAGER="-Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager"
fi

Set UMASK unless it has been overridden

if [ -z "$UMASK" ]; then
UMASK="0027"
fi
umask $UMASK

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46

上述代碼, [ -t 1 ]=true, $cygwin=false,而后是一些變量的判斷。此時變量的變化為:

have_tty=1
JSSE_OPTS="-Djdk.tls.ephemeralDHKeySize=2048"
JAVA_OPTS="-Djdk.tls.ephemeralDHKeySize=2048"
JAVA_OPTS="-Djdk.tls.ephemeralDHKeySize=2048 -Djava.protocol.handler.pkgs=org.apache.catalina.webresources"
LOGGING_CONFIG="-Djava.util.logging.config.file=/usr/local/apache-tomcat-9.0.21/conf/logging.properties"
LOGGING_MANAGER="-Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager"
UMASK="0027"

    
    
   
   
           
   
   
  
  
          
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

代碼塊:

# Java 9 no longer supports the java.endorsed.dirs
# system property. Only try to use it if
# JAVA_ENDORSED_DIRS was explicitly set
# or CATALINA_HOME/endorsed exists.
ENDORSED_PROP=ignore.endorsed.dirs
if [ -n "$JAVA_ENDORSED_DIRS" ]; then
    ENDORSED_PROP=java.endorsed.dirs
fi
if [ -d "$CATALINA_HOME/endorsed" ]; then
    ENDORSED_PROP=java.endorsed.dirs
fi

Make the umask available when using the org.apache.catalina.security.SecurityListener

JAVA_OPTS="$JAVA_OPTS -Dorg.apache.catalina.security.SecurityListener.UMASK=umask"

if [ -z "$USE_NOHUP" ]; then
if $hpux; then
USE_NOHUP="true"
else
USE_NOHUP="false"
fi
fi
unset _NOHUP
if [ "$USE_NOHUP" = "true" ]; then
_NOHUP="nohup"
fi

Add the JAVA 9 specific start-up parameters required by Tomcat

JDK_JAVA_OPTIONS="$JDK_JAVA_OPTIONS --add-opens=java.base/java.lang=ALL-UNNAMED"
JDK_JAVA_OPTIONS="$JDK_JAVA_OPTIONS --add-opens=java.base/java.io=ALL-UNNAMED"
JDK_JAVA_OPTIONS="$JDK_JAVA_OPTIONS --add-opens=java.rmi/sun.rmi.transport=ALL-UNNAMED"
export JDK_JAVA_OPTIONS

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32

上述代碼,[ -n "$JAVA_ENDORSED_DIRS" ]=falase, [ -d "$CATALINA_HOME/endorsed" ]=false, [ -z "$USE_NOHUP" ]=true,,此時變量變化如下:

JAVA_OPTS="-Djdk.tls.ephemeralDHKeySize=2048 -Djava.protocol.handler.pkgs=org.apache.catalina.webresources -Dorg.apache.catalina.security.SecurityListener.UMASK=0027"
USE_NOHUP="false"
JDK_JAVA_OPTIONS="--add-opens=java.base/java.lang=ALL-UNNAMED"
JDK_JAVA_OPTIONS="--add-opens=java.base/java.io=ALL-UNNAMED"
JDK_JAVA_OPTIONS="--add-opens=java.rmi/sun.rmi.transport=ALL-UNNAMED"

    
    
   
   
           
   
   
  
  
          
  • 1
  • 2
  • 3
  • 4
  • 5

代碼塊:

# ----- Execute The Requested Command -----------------------------------------

Bugzilla 37848: only output this if we have a TTY

if [ $have_tty -eq 1 ]; then
echo "Using CATALINA_BASE: $CATALINA_BASE"
echo "Using CATALINA_HOME: $CATALINA_HOME"
echo "Using CATALINA_TMPDIR: $CATALINA_TMPDIR"
if [ "$1" = "debug" ] ; then
echo "Using JAVA_HOME: $JAVA_HOME"
else
echo "Using JRE_HOME: $JRE_HOME"
fi
echo "Using CLASSPATH: $CLASSPATH"
if [ ! -z "$CATALINA_PID" ]; then
echo "Using CATALINA_PID: $CATALINA_PID"
fi
fi

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

上述代碼沒有做什么操作,只是打印了一些信息而已。
調用此腳本的外部參數為start,故下述只看 [ $1 = start ]的代碼塊:

if [ "$1" = "jpda" ] ; then
略
fi
if [ "$1" = "debug" ] ; then
略
elif [ "$1" = "run" ]; then
略
elif [ "$1" = "start" ] ; then

if [ ! -z "$CATALINA_PID" ]; then
if [ -f "$CATALINA_PID" ]; then
if [ -s "$CATALINA_PID" ]; then
echo "Existing PID file found during start."
if [ -r "$CATALINA_PID" ]; then
PID=cat "$CATALINA_PID"
ps -p $PID >/dev/null 2>&1
if [ $? -eq 0 ] ; then
echo "Tomcat appears to still be running with PID $PID. Start aborted."
echo "If the following process is not a Tomcat process, remove the PID file and try again:"
ps -f -p $PID
exit 1
else
echo "Removing/clearing stale PID file."
rm -f "$CATALINA_PID" >/dev/null 2>&1
if [ $? != 0 ]; then
if [ -w "$CATALINA_PID" ]; then
cat /dev/null > "$CATALINA_PID"
else
echo "Unable to remove or clear stale PID file. Start aborted."
exit 1
fi
fi
fi
else
echo "Unable to read PID file. Start aborted."
exit 1
fi
else
rm -f "$CATALINA_PID" >/dev/null 2>&1
if [ $? != 0 ]; then
if [ ! -w "$CATALINA_PID" ]; then
echo "Unable to remove or write to empty PID file. Start aborted."
exit 1
fi
fi
fi
fi
fi

shift
touch "$CATALINA_OUT"
if [ "$1" = "-security" ] ; then
if [ $have_tty -eq 1 ]; then
echo "Using Security Manager"
fi
shift
eval $_NOHUP ""$_RUNJAVA"" ""$LOGGING_CONFIG"" $LOGGING_MANAGER $JAVA_OPTS $CATALINA_OPTS
-D$ENDORSED_PROP=""$JAVA_ENDORSED_DIRS""
-classpath ""$CLASSPATH""
-Djava.security.manager
-Djava.security.policy==""$CATALINA_BASE/conf/catalina.policy""
-Dcatalina.base=""$CATALINA_BASE""
-Dcatalina.home=""$CATALINA_HOME""
-Djava.io.tmpdir=""$CATALINA_TMPDIR""
org.apache.catalina.startup.Bootstrap "$@" start
>> "$CATALINA_OUT" 2>&1 "&"

else
eval $_NOHUP ""$_RUNJAVA"" ""$LOGGING_CONFIG"" $LOGGING_MANAGER $JAVA_OPTS $CATALINA_OPTS
-D$ENDORSED_PROP=""$JAVA_ENDORSED_DIRS""
-classpath ""$CLASSPATH""
-Dcatalina.base=""$CATALINA_BASE""
-Dcatalina.home=""$CATALINA_HOME""
-Djava.io.tmpdir=""$CATALINA_TMPDIR""
org.apache.catalina.startup.Bootstrap "$@" start
>> "$CATALINA_OUT" 2>&1 "&"

fi

if [ ! -z "$CATALINA_PID" ]; then
echo $! > "$CATALINA_PID"
fi

echo "Tomcat started."
elif [ "$1" = "stop" ] ; then

elif [ "$1" = "configtest" ] ; then

elif [ "$1" = "version" ] ; then

else

fi

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93

上述非start外部傳參的判斷條件省略了。[ "$1" = "start" ]=true, [ ! -z "$CATALINA_PID" ]=false,此時代碼走到 shift這里,由於只有一個外部傳參start,故 [ "$1" = "-security" ]=false,此時進入 else 分支,執行下述命令:

 eval $_NOHUP "\"$_RUNJAVA\"" "\"$LOGGING_CONFIG\"" $LOGGING_MANAGER $JAVA_OPTS $CATALINA_OPTS \
      -D$ENDORSED_PROP="\"$JAVA_ENDORSED_DIRS\"" \
      -classpath "\"$CLASSPATH\"" \
      -Dcatalina.base="\"$CATALINA_BASE\"" \
      -Dcatalina.home="\"$CATALINA_HOME\"" \
      -Djava.io.tmpdir="\"$CATALINA_TMPDIR\"" \
      org.apache.catalina.startup.Bootstrap "$@" start \
      >> "$CATALINA_OUT" 2>&1 "&"

注:從setclasspath.sh得變量

_RUNJAVA=/usr/java/jdk1.8.0_91/bin/java

_RUNJDB=/usr/java/jdk1.8.0_91/bin/jdb

上述命令,將變量替換掉,為:

/usr/java/jdk1.8.0_91/bin/java
-Djava.util.logging.config.file=/usr/local/apache-tomcat-9.0.21/conf/logging.properties\
-Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager
-Djdk.tls.ephemeralDHKeySize=2048 -Djava.protocol.handler.pkgs=org.apache.catalina.webresources -Dorg.apache.catalina.security.SecurityListener.UMASK=0027
-D$ENDORSED_PROP=
-classpath /usr/local/apache-tomcat-9.0.21/bin/bootstrap.jar:/usr/local/apache-tomcat-9.0.21/bin/tomcat-juli.jar
-Dcatalina.base=/usr/local/apache-tomcat-9.0.21
-Dcatalina.home=/usr/local/apache-tomcat-9.0.21
-Djava.io.tmpdir=/usr/local/apache-tomcat-9.0.21/temp
org.apache.catalina.startup.Bootstrap start
>> /usr/local/apache-tomcat-9.0.21/logs/catalina.out 2>&1 &

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24

所以tomcat執行start.sh 腳本時,通常情況下 就是上述這么一個命令。你可以直接在命令行執行此命令:

[root@test-cdh conf]# /usr/java/jdk1.8.0_91/bin/java -Djava.util.logging.config.file=/usr/local/apache-tomcat-9.0.21/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djdk.tls.ephemeralDHKeySize=2048 -Djava.protocol.handler.pkgs=org.apache.catalina.webresources -Dorg.apache.catalina.security.SecurityListener.UMASK=0027 -D= -classpath /usr/local/apache-tomcat-9.0.21/bin/bootstrap.jar:/usr/local/apache-tomcat-9.0.21/bin/tomcat-juli.jar -Dcatalina.base=/usr/local/apache-tomcat-9.0.21 -Dcatalina.home=/usr/local/apache-tomcat-9.0.21 -Djava.io.tmpdir=/usr/local/apache-tomcat-9.0.21/temp org.apache.catalina.startup.Bootstrap start >> /usr/local/apache-tomcat-9.0.21/logs/catalina.out 2>&1 &
[1] 49852

    
    
   
   
           
   
   
  
  
          
  • 1
  • 2

現在是不是覺得,寫的很復雜的腳本,只是一條有較多java參數的命令而已,是不是頓時豁然開朗。

附:上述有很多判斷的語句,有一博文整理了,如下(鏈接為:https://blog.csdn.net/weixin_30367873/article/details/95135922):

運算符	描述	示例
文件比較運算符
-e filename	如果 filename 存在,則為真	[ -e /var/log/syslog ]
-d filename	如果 filename 為目錄,則為真	[ -d /tmp/mydir ]
-f filename	如果 filename 為常規文件,則為真	[ -f /usr/bin/grep ]
-L filename	如果 filename 為符號鏈接,則為真	[ -L /usr/bin/grep ]
-r filename	如果 filename 可讀,則為真	[ -r /var/log/syslog ]
-w filename	如果 filename 可寫,則為真	[ -w /var/mytmp.txt ]
-x filename	如果 filename 可執行,則為真	[ -L /usr/bin/grep ]
filename1 -nt filename2	如果 filename1 比 filename2 新,則為真	[ /tmp/install/etc/services -nt /etc/services ]
filename1 -ot filename2	如果 filename1 比 filename2 舊,則為真	[ /boot/bzImage -ot arch/i386/boot/bzImage ]
字符串比較運算符 (請注意引號的使用,這是防止空格擾亂代碼的好方法)
-z string	如果 string 長度為零,則為真	[ -z "$myvar" ]
-n string	如果 string 長度非零,則為真	[ -n "$myvar" ]
string1 = string2	如果 string1 與 string2 相同,則為真	[ "$myvar" = "one two three" ]
string1 != string2	如果 string1 與 string2 不同,則為真	[ "$myvar" != "one two three" ]
算術比較運算符
num1 -eq num2	等於	[ 3 -eq $mynum ]
num1 -ne num2	不等於	[ 3 -ne $mynum ]
num1 -lt num2	小於	[ 3 -lt $mynum ]
num1 -le num2	小於或等於	[ 3 -le $mynum ]
num1 -gt num2	大於	[ 3 -gt $mynum ]
num1 -ge num2	大於或等於	[ 3 -ge $mynum ]

    
    
   
   
           
   
   
  
  
          
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
出處:https://blog.csdn.net/ck3207/article/details/100932690


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM