ما هو الخطأ في برنامج Shell النصي الخاص بي في SunOS، والذي يعمل بشكل جيد على نكهات Linux الأخرى

StackOverflow https://stackoverflow.com/questions/7832277

  •  27-10-2019
  •  | 
  •  

سؤال

من فضلك، هل يمكن لأي شخص أن يحدد ما هي المشكلة في برنامج 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] وهو خطأ ، بدلاً من إجراء اختبار بالجانب الأيمن الفارغ الذي يفشل في بعض القذائف.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top