接上一篇文章:我們啟動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
。在服務器上執行uname
為Linux
。比如我的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_HOME
與CATALINA_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