मान लें कि आपके पास विभाजकों के रूप में रिक्त स्थान है:
newline_separated=${space_separated// /$'\n'}
हालाँकि आप शायद गलत सवाल पूछ रहे हैं। (जरूरी नहीं, उदाहरण के लिए यह एक मेकफाइल में आ सकता है।) फ़ाइल नामों की एक अंतरिक्ष-पृथक सूची वास्तव में काम नहीं करती है: क्या होगा यदि फ़ाइल नामों में से एक में रिक्त स्थान शामिल हैं?
यदि किसी प्रोग्राम को फ़ाइल नाम तर्क के रूप में मिलते हैं, तो उन्हें रिक्त स्थान से न जोड़ें। का प्रयोग करें "$@"
एक एक करके उन्हें एक का उपयोग करने की। हालाँकि echo "$@"
बीच-बीच में रिक्त स्थान वाले तर्कों को प्रिंट करता है, echo
इसके कारण : यह विभाजकों के रूप में रिक्त स्थान के साथ अपने तर्कों को छापता है। somecommand "$@"
कमांड के लिए अलग-अलग तर्कों के रूप में फ़ाइल नामों को पास करता है। यदि आप अलग-अलग लाइनों पर तर्क मुद्रित करना चाहते हैं, तो आप उपयोग कर सकते हैं
printf '%s\n' "$@"
यदि आपके पास स्थान-पृथक फ़ाइल नाम हैं और आप उन्हें काम करने के लिए एक सरणी में रखना चाहते हैं, तो आप वर्णों पर मान को विभाजित करने के लिए एक निर्विवाद चर विस्तार का उपयोग कर सकते हैं IFS
(आपको वाइल्डकार्ड विस्तार को अक्षम करना होगा set -f
, अन्यथा ग्लोब पैटर्न का विस्तार मूल्य में किया जाएगा):
space_separated_list='/path/to/file1 /path/to/file2 /path/to/file3'
IFS=' '; set -f
eval "array=(\$space_separated_list)"
for x in "${array[@]}"; do …
आप इसे ऐसे फ़ंक्शन में एन्क्रिप्ट कर सकते हैं जो -f
सेटिंग को पुनर्स्थापित करता है और IFS
जब यह किया जाता है तो इसका मूल्य :
split_list () {
local IFS=' ' flags='+f'
if [[ $- = *f* ]]; then flags=; fi
set -f
eval "$1=($2)"
set $flags
}
split_list array '/path/to/file1 /path/to/file2 /path/to/file3'
for x in "${array[@]}"; do …