मैं शेल स्क्रिप्टिंग में नया हूं:
मेरे पास निम्नलिखित है:
old=/dev/sda
new=/dev/sda5
इन चर को देखते हुए, मुझे निकालने की आवश्यकता है 5
"नई" स्ट्रिंग से।
मुझे इसे किस प्रकार करना चाहिए? sed
? awk
?
का उपयोग करने की कोशिश की:
partitionno=$(echo $new | sed "s/$old//g")
उत्तर:
जवाब के लिए 3 № 1अपनी कमांड में कम से कम परिवर्तन के साथ सही परिणाम प्राप्त करने के लिए, प्रयास करें:
partitionno=$(echo "$new" | sed "s|$old||g")
यहाँ दो मुख्य बिंदु हैं:
शेल चरों का विस्तार एकल उद्धरणों के अंदर नहीं किया जाता है। इसलिए
"$old"
मूल चार वर्णों के रूप में रहता है:$
,o
,l
, तथाd
। शेल चरों के विस्तार के लिए, दोहरे उद्धरण चिह्नों का उपयोग करें।sed "s/$old//g"
अभी भी काम नहीं किया क्योंकि बहुत सारे स्लैश हैं। एक विकल्प कमांड तीन स्लैश का उपयोग करता है। शेल के विस्तार के बाद$old
, पांच स्लैश हैं। समाधान विकल्प कमांड के लिए एक अलग सीमांकक का उपयोग करना है। मैंने चुना|
ऊपर क्योंकि|
फ़ाइल नाम में होने की संभावना नहीं है।
उत्तर № 2 के लिए 1
का उपयोग करते हुए शैल पैरामीटर विस्तार:
$ old=/dev/sda
$ new=/dev/sda5
$ echo "${new#$old}"
5
${पैरामीटर#शब्द}
${पैरामीटर##शब्द}
एक पैटर्न बनाने के लिए शब्द का विस्तार किया जाता है जैसेफ़ाइल नाम विस्तार में (फ़ाइल नाम विस्तार देखें)। यदि पैटर्न पैरामीटर के विस्तारित मान की शुरुआत से मेल खाता है, तो विस्तार का परिणाम सबसे छोटा मिलान पैटर्न ('#' केस) या सबसे लंबे मिलान पैटर्न ('##' केस) के साथ पैरामीटर का विस्तारित मान है। हटा दिया गया। यदि पैरामीटर '@' या '', पैटर्न हटाने की कार्रवाई बारी-बारी से प्रत्येक स्थितीय पैरामीटर पर लागू होती है, और विस्तार परिणामी सूची है। यदि पैरामीटर '@' या 'के साथ सब्सक्राइब किया गया एक सरणी चर है', पैटर्न हटाने की कार्रवाई बारी-बारी से सरणी के प्रत्येक सदस्य पर लागू होती है, और विस्तार परिणामी सूची है।