जैसा कि पहले ही उत्तर दिया जा चुका है, चर का उपयोग करने का एक अधिक पोर्टेबल तरीका इसे उद्धृत करना है:
$ printf '%s\t%s\t%s\n' foo bar baz
foo bar baz
$ l="$(printf '%s\t%s\t%s\n' foo bar baz)"
$ <<<$l sed -n l
foo bar baz$
$ <<<"$l" sed -n l
foo\tbar\tbaz$
लाइन के साथ बैश में कार्यान्वयन का अंतर है:
l="$(printf '%s\t%s\t%s\n' foo bar baz)"; <<<$l sed -n l
यह अधिकांश गोले का परिणाम है:
/bin/sh : foo bar baz$
/bin/b43sh : foo bar baz$
/bin/bash : foo bar baz$
/bin/b44sh : foo\tbar\tbaz$
/bin/y2sh : foo\tbar\tbaz$
/bin/ksh : foo\tbar\tbaz$
/bin/ksh93 : foo\tbar\tbaz$
/bin/lksh : foo\tbar\tbaz$
/bin/mksh : foo\tbar\tbaz$
/bin/mksh-static: foo\tbar\tbaz$
/usr/bin/ksh : foo\tbar\tbaz$
/bin/zsh : foo\tbar\tbaz$
/bin/zsh4 : foo\tbar\tbaz$
केवल बैश को <<<
अयोग्य करार दिए जाने पर दाईं ओर चर को विभाजित करें ।
हालाँकि, इसे bash संस्करण 4.4 पर सही किया गया है, जिसका
अर्थ है कि $IFS
के परिणाम को प्रभावित करता है <<<
।
लाइन के साथ:
l=(1 2 3); IFS=:; sed -n l <<<"${l[*]}"
सभी गोले मूल्यों को जोड़ने के लिए IFS के पहले चरित्र का उपयोग करते हैं।
/bin/y2sh : 1:2:3$
/bin/sh : 1:2:3$
/bin/b43sh : 1:2:3$
/bin/b44sh : 1:2:3$
/bin/bash : 1:2:3$
/bin/ksh : 1:2:3$
/bin/ksh93 : 1:2:3$
/bin/lksh : 1:2:3$
/bin/mksh : 1:2:3$
/bin/zsh : 1:2:3$
/bin/zsh4 : 1:2:3$
साथ "${l[@]}"
, एक जगह विभिन्न तर्कों को अलग करने की जरूरत है, लेकिन कुछ गोले आईएफएस से मान चुन (वह सही है?)।
/bin/y2sh : 1:2:3$
/bin/sh : 1 2 3$
/bin/b43sh : 1 2 3$
/bin/b44sh : 1 2 3$
/bin/bash : 1 2 3$
/bin/ksh : 1 2 3$
/bin/ksh93 : 1 2 3$
/bin/lksh : 1:2:3$
/bin/mksh : 1:2:3$
/bin/zsh : 1:2:3$
/bin/zsh4 : 1:2:3$
एक अशक्त IFS के साथ, मान इस पंक्ति के साथ जुड़ने चाहिए:
a=(1 2 3); IFS=''; sed -n l <<<"${a[*]}"
/bin/y2sh : 123$
/bin/sh : 123$
/bin/b43sh : 123$
/bin/b44sh : 123$
/bin/bash : 123$
/bin/ksh : 123$
/bin/ksh93 : 123$
/bin/lksh : 1 2 3$
/bin/mksh : 1 2 3$
/bin/zsh : 123$
/bin/zsh4 : 123$
लेकिन lksh और mksh दोनों ऐसा करने में विफल रहते हैं।
यदि हम तर्कों की सूची में बदल जाते हैं:
l=(1 2 3); IFS=''; sed -n l <<<"${l[@]}"
/bin/y2sh : 123$
/bin/sh : 1 2 3$
/bin/b43sh : 1 2 3$
/bin/b44sh : 1 2 3$
/bin/bash : 1 2 3$
/bin/ksh : 1 2 3$
/bin/ksh93 : 1 2 3$
/bin/lksh : 1 2 3$
/bin/mksh : 1 2 3$
/bin/zsh : 123$
/bin/zsh4 : 123$
यश और zsh दोनों ही तर्क को अलग रखने में विफल हैं। क्या वह बग है?
echo -e 'foo\tbar\tbaz\n...'
,echo $'foo\tbar\tbaz\n...'
, याprintf 'foo\tbar\tbaz\n...\n'
या इनमें से रूपों। यह आपको व्यक्तिगत रूप से प्रत्येक टैब या न्यूलाइन को लपेटने से बचाता है।