मैंने इस बारे में पढ़ा कि मुझे चारे में चरों को भाग लेना चाहिए, जैसे $ फू के बदले "$ फू"। हालाँकि, एक स्क्रिप्ट लिखते समय, मुझे एक ऐसा मामला मिला, जहाँ यह उद्धरण के बिना काम करता है, लेकिन उनके साथ नहीं:
wget_options='--mirror --no-host-directories'
local_root="$1" # ./testdir recieved from command line
remote_root="$2" # ftp://XXX recieved from command line
relative_path="$3" # /XXX received from command line
यह एक काम करता है:
wget $wget_options --directory_prefix="$local_root" "$remote_root$relative_path"
यह नहीं होता है (डबल उद्धरण $ wget_options ध्यान दें):
wget "$wget_options" --directory_prefix="$local_root" "$remote_root$relative_path"
इसका क्या कारण है?
पहली पंक्ति अच्छा संस्करण है; या मुझे यह संदेह होना चाहिए कि कहीं न कहीं एक छिपी हुई त्रुटि है जो इस व्यवहार का कारण बनती है?
सामान्य तौर पर, मुझे यह समझने के लिए अच्छे दस्तावेज़ कहां मिलते हैं कि कैसे बैश और उसके उद्धरण काम करते हैं? इस स्क्रिप्ट को लिखने के दौरान मुझे लगता है कि मैंने नियमों को समझने के बजाय परीक्षण और त्रुटि के आधार पर काम करना शुरू कर दिया।
wget
क्या --mirror --no-host-directories
अर्थ है (एक तर्क के रूप में), लेकिन यह दो तर्कों में विभाजित होने पर इसे संभालता है । बहुत कम प्रोग्राम विशेष रूप से रिक्त स्थान वेक्टर के अंदर रिक्त स्थान और उद्धरण का इलाज करते हैं। समस्या यह है कि bash
, और अन्य गोले,>
bash
है, जिससे आप कल्पना कर सकते हैं कि $a
यह सीधे अपनी सामग्री लिखने के बराबर है। अब यह मुद्दा स्पष्ट है: a="-a -b"; cmd "$a"
विस्तार करने के लिए cmd "-a -b"
, लेकिन cmd
शायद इसका मतलब यह नहीं है। cmd $a
फैलता है cmd -a -b
, जो शायद काम करता है ।