बैश अतिरिक्त एकल उद्धरण जोड़ता है


14

मुझे अपनी स्क्रिप्ट निष्पादित करने में समस्या है।
डिबग मोड (बैश-एक्स) में इसे निष्पादित करते समय, मैं देख सकता हूं कि बैश अतिरिक्त उद्धरण जोड़ रहा है। वहाँ मेरी स्क्रिप्ट विफल हो रही है।

यहाँ यह मेरी स्क्रिप्ट के भीतर है:

testvar="\"sudo /home/pi/shared/blink.sh 27 off\""
ssh -n -q -q -o BatchMode=yes -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no -o ConnectTimeout=5 $1 ${testvar}

यह आउटपुट है:

ssh -n -q -q -o BatchMode=yes -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no -o ConnectTimeout=5 192.168.42.105 '"sudo' /home/pi/shared/blink.sh 27 'off"'

जवाबों:


9

बैश एकल उद्धरण प्रदर्शित कर रहा है ताकि एक कमांड दिखाया जा सके जो वैध इनपुट सिंटैक्स है। यह एक कमांड नहीं चल रहा है जिसमें कमांड में इन सिंगल कोट्स में एक पैरामीटर हो ssh

ssh  '"sudo' /home/pi/shared/blink.sh 27 'off"'

आपको बताता है कि ssh आदेश के पिछले 4 मापदंड हैं "sudo, /home/pi/shared/blink.sh, 27और off"

दूरस्थ होस्ट पर, ssh डेमॉन कमांड के शब्दों को विभाजक के रूप में रिक्त स्थान के साथ जोड़ता है, इसलिए दूरस्थ कमांड जिसे आप निष्पादित कर रहे हैं वह है

"sudo /home/pi/shared/blink.sh 27 off"

यह एक कमांड को निष्पादित करने का प्रयास करता है जिसका नाम है sudo /home/pi/shared/blink.sh 27 off, जो निश्चित रूप से मौजूद नहीं है।

अपनी परिभाषा से दोहरे उद्धरण हटाएं testvar

यहां कोई फर्क नहीं पड़ता, लेकिन यह संभवतः आपके वास्तविक मामले में मायने रखता है: इसके बजाय ${testvar}, लिखें "$testvar"(या "${testvar}"यदि आप चाहते हैं लेकिन ब्रेसिज़ वैकल्पिक हैं)। हमेशा परिवर्तनीय प्रतिस्थापन के आसपास दोहरे उद्धरण लगाएं जब तक आपको पता न हो कि आपको उन्हें छोड़ने की आवश्यकता क्यों है। "$testvar"चर के मूल्य में विस्तार होता है testvar, जबकि $testvarदोहरे उद्धरण चिह्नों में नहीं मानने testvarपर ग्लोब पैटर्न की व्हाट्सएप से अलग सूची के रूप में मान लिया जाता है।


3

मुझे लगता है कि आपको उपयोग करना चाहिए:

testvar="sudo /home/pi/shared/blink.sh 27 off"
ssh -n -q -q -o BatchMode=yes -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no -o ConnectTimeout=5 $1 "${testvar}"

यह मेरे लिए काम कर रहा है:

$ bash -x -c 'testvar="la la la"; echo "${testvar}"'
+ testvar='la la la'
+ echo 'la la la'
la la la

लेकिन अगर आपने जैसा लिखा है, वैसा ही गलत परिणाम मुझे मिलता है:

$ bash -x -c 'testvar="\"la la la\""; echo ${testvar}'
+ testvar='"la la la"'
+ echo '"la' la 'la"'
"la la la"

उद्धरण महत्वपूर्ण हैं क्योंकि वे एकल तर्क बनाने के लिए कई शब्दों को एक साथ समूहित करने के लिए शेल के तंत्र हैं।
ग्लेन जैकमैन

2

शेल, चर के मान को शब्दों में विभाजित करता है। विभाजन को रोकने के लिए इसे दोहराएं। फर्क देखें:

t='"a b c"'
set -xv
echo $t
echo "$t"
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.