বাশ অতিরিক্ত একক উদ্ধৃতি যোগ করে


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}"যদি আপনি চান তবে বন্ধনীগুলি areচ্ছিক)। পরিবর্তনশীল বিকল্পগুলির চারপাশে ডাবল কোটগুলি সর্বদা রাখুন যদি না আপনি কেন জানেন যে এগুলি কেন আপনাকে ছেড়ে চলে যেতে হবে। "$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"
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.