ما هو الخطأ في برنامج Shell النصي الخاص بي في SunOS، والذي يعمل بشكل جيد على نكهات Linux الأخرى
سؤال
من فضلك، هل يمكن لأي شخص أن يحدد ما هي المشكلة في برنامج Shell النصي الخاص بي، فهو يعمل بشكل جيد على أنظمة Linux الأخرى باستثناء Sunos أدناه هو مخرجاتي
drifter% cat run.sh
#!/bin/sh -x
if [ ! $JAVA_HOME ] || [ $JAVA_HOME == "" ]
then
echo Enter path to JAVA HOME:
read JAVA_HOME
fi
if [ ! -f $JAVA_HOME/bin/java ]
then
echo "JAVA_HOME variable does not point to a valid java instance"
exit 1
fi
echo "Using JAVA_HOME: "$JAVA_HOME
JAVA_BIN=$JAVA_HOME/bin
ver=`$JAVA_HOME/bin/java -version 2>&1 | head -1 | awk '{print $NF}' | cut -d'.' -f2`
if [ $ver -ge 5 ]
then
JAVA_LIB=`pwd`/lib
export JAVA_LIB
$JAVA_BIN/java -cp ./lib/a-jdbc-sqlserver-4.2.1.jar:./lib/a-jdbc-db2-4.2.1.jar:./lib/ilmInit.jar:./lib/db2jcc.jar:./lib/db2jcc_license_cisuz.jar:./lib/db2jcc_license_cu.jar:./lib/csm-runtime-1.0.jar:./lib/csm-dbutil-1.0.jar:./lib/classes12_g.jar:./lib/commons-beanutils-1.8.3.jar:./lib/commons-cli-1.2.jar:./lib/commons-exec-1.1.jar:./lib/log4j-1.2.8.jar:./lib/groovy-all-1.8.1.jar -Dlog4j.configuration=com/a/csm/log4j.xml -Dendorsed_plugins_dir=./plugins InitValues $@
else
echo Current JDK $ver
echo "Expected JDK 1.5 or later. Please fix your JAVA HOME and try again."
exit 1
fi
drifter% ./run.sh
+ [ ! ]
./run.sh: test: argument expected
drifter%
ملحوظة:انا استخدم csh
تحديث
لقد تغيرت "$JAVA_HOME"
في كل مكان
ولكن لا يزال أحصل عليه
drifter% ./run.sh
+ [ ! /home/ilma1/java16/java ]
+ [ /home/ilma1/java16/java == ]
./run.sh: test: unknown operator ==
المحلول
من المحتمل $JAVA_HOME
لم يتم ضبطه.عادةً ما يتم توسيع المتغير غير المحدد إلى سلسلة فارغة، لذلك:
if [ ! $JAVA_HOME ] || [ $JAVA_HOME == "" ]
يعادل هذا:
if [ ! ] || [ == "" ]
وهو خطأ في بناء الجملة.([
هو اسم آخر ل test
يأمر؛عادةً ما يكون رابطًا رمزيًا.)
حاول اقتباس اسم المتغير:
if [ "$JAVA_HOME" == "" ]
وإذا قمت بتعيين $JAVA_HOME
استجابةً للمطالبة، ربما تريد ذلك export
هو - هي.(في الواقع لست متأكدا من ذلك؛يفعل java
يعتمد على $JAVA_HOME
يتم تعيينها؟)
يحرر:
حسنًا، يبدو الأمر كذلك $JAVA_HOME
تم تعيين.
ل test
(أو [
) الأمر، عامل المساواة في السلسلة هو =
, ، لا ==
.
يحاول:
if [ "$JAVA_HOME" = "" ]
تحرير2:
هذا:
if [ -z "$JAVA_HOME" ]
ربما يكون أفضل (راجع إجابة @ n.m).
نصائح أخرى
الطريقة المحمولة للتحقق من السلاسل الفارغة هي
if [ -n "%VAR" ] #true if $VAR is non-empty
أو
if [ -z "$VAR" ] # true if $VAR is empty
ومن الممكن أيضا استخدامها if [ "x$VAR" == "x" ]
.هذا النموذج مفيد لمقارنة سلسلة عشوائية يمكن أن تكون فارغة، على سبيل المثال. if [ "x$JAVA_HOME" == "x$SCALA_HOME" ]
.
النموذج ث if [ "$VAR" ]
يمكن أن تفشل مع بعض التجسيدات القديمة للصدفة، على الرغم من أن نظام التشغيل SunOS الحديث يجب أن يكون على ما يرام.
== ليس عامل تشغيل في sh. واحد= هو عامل الاختبار المتوافق مع posix.
Genacodicetagpreلقد واجهت للتو هذه المشكلة في Solaris 10 ، ووجدت مقتطفًا رائعًا من المعلومات في هذا المنشور الذي مضى عليه عشر سنوات: http://lists.infowares.com/archive/clug/2003-F February /001849.html
لقد حاولت للتو 'if ["a"=="a"]؛ ثم صدى نعم ؛ فاي في بورن موجه قذيفة على عدة منصات مختلفة. قال سولاريس 'الاختبار: عامل غير معروف== 'قال AIX' sh:==: مشغل اختبار غير معروف 'HP-UX قال 'sh:==: معلمة أمر الاختبار غير صالحة.' قال IRIX "نعم" (فقط لتكون مختلف :))
ثانيًا ، من الممكن أن sh لا يعرف ماذا يفعل بسلسلة فارغة. اختراق المدرسة القديمة هو تغيير اختبارك إلى Genacodicetagpre
الذي يقارن بالنسبة لي [XX / opt / jdk1.7.0_02= XX] وهو خطأ ، بدلاً من إجراء اختبار بالجانب الأيمن الفارغ الذي يفشل في بعض القذائف.