উত্তর:
এখানে এমন একটি উপায় যা বাশ প্যারামিটার সম্প্রসারণ এবং এর IFS
বিশেষ চলকটি ব্যবহার করে।
$ System=('s1' 's2' 's3' 's4 4 4')
$ ( IFS=$'\n'; echo "${System[*]}" )
আমরা IFS
বর্তমান পরিবেশের মান ওভাররাইট করা এড়াতে সাবসেল ব্যবহার করি । সেই সাবশেলে, আমরা এর পরে এর মানটি সংশোধন করি IFS
যাতে প্রথম অক্ষরটি একটি নতুন লাইন হয় ( $'...'
উদ্ধৃতি ব্যবহার করে)। অবশেষে, আমরা একক শব্দ হিসাবে অ্যারের সামগ্রীগুলি মুদ্রণ করতে প্যারামিটার সম্প্রসারণ ব্যবহার করি; প্রতিটি উপাদান প্রথম চ্যারাটার দ্বারা পৃথক করা হয় IFS
।
একটি পরিবর্তনশীল ক্যাপচার:
$ var=$( IFS=$'\n'; echo "${System[*]}" )
যদি আপনার বাশ যথেষ্ট নতুন হয় (4.2 বা তার পরে), আপনি এখনও (এবং হওয়া উচিত) বিকল্পটি printf
দিয়ে ব্যবহার করতে পারেন -v
:
$ printf -v var "%s\n" "${System[@]}"
উভয় ক্ষেত্রেই, আপনি চূড়ান্ত নতুন লাইনটি না চাইতে পারেন var
। এটা মুছে ফেলার জন্য:
$ var=${var%?} # Remove the final character of var
var=${var%?}
পরিবর্তে হওয়া উচিত নয় ? এটি কোনও নিয়মিত প্রকাশ নয়, সুতরাং .
কেবলমাত্র একটি পিরিয়ড চরিত্রের সাথে মেলে।
$ IFS=', ' $ echo ${VAR[*]} first second third $ echo "${VAR[*]}" first,second,third
awk -v sep='\n' 'BEGIN{ORS=OFS="";for(i=1;i<ARGC;i++){print ARGV[i],ARGC-i-1?sep:""}}' "${arr[@]}"
অথবা
perl -le 'print join "\n",@ARGV' "${arr[@]}"
অথবা
python -c 'import sys;print "\n".join(sys.argv[1:])' "${arr[@]}"
অথবা
sh -c 'IFS=$'\''\n'\'';echo "$*"' '' "${arr[@]}"
অথবা
lua <(echo 'print(table.concat(arg,"\n"))') "${arr[@]}"
অথবা
tclsh <(echo 'puts [join $argv "\n"]') "${arr[@]}"
অথবা
php -r 'echo implode("\n",array_slice($argv,1));' -- "${arr[@]}"
অথবা
ruby -e 'puts ARGV.join("\n")' "${arr[@]}"
এতক্ষণ আমি এটাই মনে করিয়ে দিতে পারি।
উপরের সমাধানগুলি এটি বেশ অনেকগুলি, তবে মূল প্রশ্নটি ফাইলের আউটপুট চেয়েছে:
$ a=(a b c d e)
$ ( IFS=$'\n'; echo "${a[*]}" ) > /tmp/file
$ cat /tmp/file
a
b
c
d
e
$
দ্রষ্টব্য: 1) 'প্রতিধ্বনি' চূড়ান্ত নিউলাইন সরবরাহ করে 2) যদি এই ফাইলটি আবার ব্যাশের মাধ্যমে পড়তে পারে, তবে ঘোষিত -p সিরিয়ালাইজেশন চেয়েছিল হতে পারে।
এর জন্য ব্যবহার :
for each in "${alpha[@]}"
do
echo "$each"
done
ইতিহাস ব্যবহার ; নোটগুলি ব্যর্থ হবে যদি আপনার মানগুলি থাকে !
:
history -p "${alpha[@]}"
বেসনাম ব্যবহার করা ; নোটগুলি ব্যর্থ হবে যদি আপনার মানগুলি থাকে /
:
basename -a "${alpha[@]}"
শুফ ব্যবহার করা ; নোট করুন যে ফলাফলগুলি ক্রমে প্রকাশিত হতে পারে:
shuf -e "${alpha[@]}"
আমার গ্রহণ , পরিবর্তন না করে কেবল বাশ বিল্টিন ব্যবহার করে IFS
:
# $1 separator
# $2… strings
join_strings () {
declare separator="$1";
declare -a args=("${@:2}");
declare result;
printf -v result '%s' "${args[@]/#/$separator}";
printf '%s' "${result:${#separator}}"
}
$ join_strings $'\n' "a b c" "d e f" "g h i"
a b c
d e f
g h i
আপনি যে কোনও বিভাজক ব্যবহার করতে পারেন:
$ join_strings '===' "a b c" "d e f" "g h i"
a b c===d e f===g h i
printf
একটি অ্যারের থেকে সীমাবদ্ধ স্ট্রিং তৈরি করার জন্য এটি সবচেয়ে দক্ষ পদ্ধতির বলে মনে হচ্ছে:
# create a delimited string; note that printf doesn't put the trailing delimiter
# need to save and restore IFS
# it is prudent to put the whole logic on a single line so as to minimize the risk of future code changes breaking the sequence of saving/restoring of IFS
oldIFS=$IFS; IFS=$'\n'; printf -v var "${arr[*]}"; IFS=$oldIFS
# print string to file; note that the newline is required in the format string because printf wouldn't put a trailing delimiter (which is a good thing)
printf '%s\n' "$var" > file
এটি করার একটি এমনকি সহজ উপায় হ'ল:
delim=$'\n'
printf -v var "%s$delim" "${arr[@]}" # create a delimited string
var="${var%$delim}" # remove the trailing delimiter
delim=:
arr=(one two three)
printf -v var "%s$delim" "${arr[@]}" # yields one:two:three:
var="${var%$delim}" # yields one:two_three