2013-01-24 10 views
32

मैं एक bash स्क्रिप्ट कि अगर वहाँ कम से कम एक पैरामीटर है की जाँच करता है लिखना चाहते हैं और अगर वहाँ, एक है कि अगर पैरामीटर है या तो एक 0 या एक 1. इस स्क्रिप्ट है:बैश पूर्णांक तुलना

#/bin/bash 
if (("$#" < 1)) && ((("$0" != 1)) || (("$0" -ne 0q))) ; then 
echo this script requires a 1 or 0 as first parameter. 
fi 
xinput set-prop 12 "Device Enabled" $0 

./setTouchpadEnabled: line 2: ((: ./setTouchpadEnabled != 1: syntax error: operand expected (error token is "./setTouchpadEnabled != 1") 
./setTouchpadEnabled: line 2: ((: ./setTouchpadEnabled -ne 0q: syntax error: operand expected (error token is "./setTouchpadEnabled -ne 0q") 

क्या मैं गलत कर रहा हूँ:

यह निम्न त्रुटियों देता है?

+0

ऐसा लगता है कि आप 'श का उपयोग कर अपनी स्क्रिप्ट चला रहे हैं।/SetTouchpadEnabled' बजाय पार्टी का उपयोग करने का। – jordanm

+0

@jordanm क्या आप शेबांग लाइन में एक धमाके की कमी का जिक्र कर रहे हैं? – Kev

उत्तर

32

यह स्क्रिप्ट काम करता है!

#/bin/bash 
if [[ ("$#" < 1) || (!("$1" == 1) && !("$1" == 0)) ]] ; then 
    echo this script requires a 1 or 0 as first parameter. 
else 
    echo "first parameter is $1" 
    xinput set-prop 12 "Device Enabled" $0 
fi 

लेकिन यह भी काम करता है, और इसके अलावा में ओपी के तर्क रहता है, के बाद से सवाल गणना के बारे में है। यहाँ यह केवल arithmetic expressions:

#/bin/bash 
if (($#)) && (($1 == 0 || $1 == 1)); then 
    echo "first parameter is $1" 
    xinput set-prop 12 "Device Enabled" $0 
else 
    echo this script requires a 1 or 0 as first parameter. 
fi 

उत्पादन के साथ है एक ही है:

$ ./tmp.sh 
this script requires a 1 or 0 as first parameter. 

$ ./tmp.sh 0 
first parameter is 0 

$ ./tmp.sh 1 
first parameter is 1 

$ ./tmp.sh 2 
this script requires a 1 or 0 as first parameter. 

[1] दूसरा विफल रहता है पहला तर्क एक स्ट्रिंग है

+0

आपको बहुत धन्यवाद, त्रुटि ऐसा इसलिए है क्योंकि कमांड xinput है और इनपुट – Cheiron

+0

कोई विशेष कारण नहीं है कि आपने अंकगणितीय अभिव्यक्तियों के साथ चिपकने का कोई विशेष कारण भी प्रश्न में उपयोग नहीं किया है? अर्थात। '((' और ')) का उपयोग' '। – 0xC0000022L

+1

@ user828193: अच्छी तरह से यह गणना के बारे में है, इसलिए अंकगणित अभिव्यक्ति * * जाने का तरीका है। यही कारण है कि मुझे यह परेशान हुआ कि आपने अपने उत्तर में प्रश्न के इस पहलू को बदल दिया है। – 0xC0000022L

5

शेल कमांड का शून्य पैरामीटर कमांड स्वयं (या कभी-कभी खोल स्वयं) होता है। आपको $1 का उपयोग करना चाहिए।

(("$#" < 1)) && ((("$1" != 1)) || (("$1" -ne 0q))) 

आपका बूलियन तर्क भी है थोड़ा भ्रमित:

(("$#" < 1 && # If the number of arguments is less than one… 
    "$1" != 1 || "$1" -ne 0)) # …how can the first argument possibly be 1 or 0? 

यह शायद है कि आप क्या चाहते:

(("$#")) && (($1 == 1 || $1 == 0)) # If true, there is at least one argument and its value is 0 or 1 
+0

यह एक सुधार है, धन्यवाद। हालांकि यह अभी भी मुझे त्रुटियां देता है: ./setTouchpadEnabled: लाइन 2: ((:! = 1: वाक्यविन्यास त्रुटि: ऑपरेंड अपेक्षित (त्रुटि टोकन "! = 1") ./setTouchpadEnabled: लाइन 2: ((:! = 0: वाक्यविन्यास त्रुटि: ऑपरेंड अपेक्षित (त्रुटि टोकन "! = 0") – Cheiron

+1

उद्धरण '(())' के अंदर कड़ाई से जरूरी नहीं हैं, लेकिन वे स्टैक ओवरफ्लो को हाइलाइटिंग स्मार्ट बनाते हैं। – kojiro

+0

उद्धरण को हटाने से वही त्रुटि मिलती है, दुर्भाग्यवश – Cheiron

10

आसान समाधान;

#/bin/bash 
if ((${1:-2} >= 2)); then 
    echo "First parameter must be 0 or 1" 
fi 
# rest of script... 

आउटपुट

$ ./test 
First parameter must be 0 or 1 
$ ./test 0 
$ ./test 1 
$ ./test 4 
First parameter must be 0 or 1 
$ ./test 2 
First parameter must be 0 or 1 

स्पष्टीकरण

  • (()) - पूर्णांकों का उपयोग कर अभिव्यक्ति का मूल्यांकन करता है।
  • ${1:-2} - अपरिभाषित होने पर 2 का मान सेट करने के लिए पैरामीटर विस्तार का उपयोग करता है।
  • >= 2 - सही है यदि पूर्णांक दो 2 से अधिक या बराबर है।
4

मुझे पता है कि इसका उत्तर दिया गया है, लेकिन यहां मेरा सिर्फ इसलिए है क्योंकि मुझे लगता है कि मामला एक सराहनीय टूल है। (हो सकता है कि क्योंकि लोगों को लगता है कि यह धीमी है, लेकिन यह एक करता है, तो के रूप में कम से कम के रूप में तेज है कभी कभी तेजी से।)

case "$1" in 
    0|1) xinput set-prop 12 "Device Enabled" $1 ;; 
     *) echo "This script requires a 1 or 0 as first parameter." ;; 
esac 
संबंधित मुद्दे