আমার কাছে যদি বাশে এর মতো অ্যারে থাকে:
FOO=( a b c )
আমি কীভাবে কমা দিয়ে উপাদানগুলিতে যোগদান করব? উদাহরণস্বরূপ, উত্পাদন a,b,c
।
আমার কাছে যদি বাশে এর মতো অ্যারে থাকে:
FOO=( a b c )
আমি কীভাবে কমা দিয়ে উপাদানগুলিতে যোগদান করব? উদাহরণস্বরূপ, উত্পাদন a,b,c
।
উত্তর:
100% খাঁটি বাশ (কোনও বাহ্যিক আদেশ নয়) এর কার্যকারিতা হিসাবে পাস্কেল পিলজের পুনর্লিখনের সমাধান:
function join_by { local IFS="$1"; shift; echo "$*"; }
উদাহরণ স্বরূপ,
join_by , a "b c" d #a,b c,d
join_by / var local tmp #var/local/tmp
join_by , "${FOO[@]}" #a,b,c
বিকল্পভাবে, আমরা @gniourf_gniourf দ্বারা ধারণাটি ব্যবহার করে একাধিক-চরিত্রের ডিলিমিটারগুলিকে সমর্থন করতে প্রিন্টফ ব্যবহার করতে পারি
function join_by { local d=$1; shift; echo -n "$1"; shift; printf "%s" "${@/#/$d}"; }
উদাহরণ স্বরূপ,
join_by , a b c #a,b,c
join_by ' , ' a b c #a , b , c
join_by ')|(' a b c #a)|(b)|(c
join_by ' %s ' a b c #a %s b %s c
join_by $'\n' a b c #a<newline>b<newline>c
join_by - a b c #a-b-c
join_by '\' a b c #a\b\c
konsolebox
শৈলী ব্যবহার করুন :) function join { local IFS=$1; __="${*:2}"; }
বা function join { IFS=$1 eval '__="${*:2}"'; }
। তারপরে ব্যবহার করুন __
। হ্যাঁ, আমি __
ফলস্বরূপ পরিবর্তনশীল;) (এবং একটি সাধারণ পুনরাবৃত্তির পরিবর্তনশীল বা অস্থায়ী ভেরিয়েবল) হিসাবে এর ব্যবহার প্রচার করি । যদি ধারণাটি কোনও জনপ্রিয় বাশ উইকি সাইটের কাছে পায় তবে তারা আমার অনুলিপি করেছে :)
$d
এর ফর্ম্যাট স্পেসিফায়ারে প্রসারণটি রাখবেন না printf
। আপনি মনে করেন আপনি নিরাপদ যেহেতু আপনি "পালিয়ে গেছেন" %
তবে অন্যান্য সতর্কতা রয়েছে: যখন ডিলিমেটারটিতে একটি ব্যাকস্ল্যাশ থাকে (যেমন, \n
) বা যখন ডিলিমিটারটি হাইফেন দিয়ে শুরু হয় (এবং অন্যরাও আমি এখন ভাবতে পারি না)। আপনি অবশ্যই এগুলি ঠিক করতে পারেন (ডাবল ব্যাকস্ল্যাশ এবং ব্যাকস্ল্যাশগুলি ব্যবহার করে ব্যাকস্ল্যাশগুলি প্রতিস্থাপন করুন printf -- "$d%s"
) তবে কিছু সময় আপনি অনুভব করবেন যে আপনি এটির সাথে কাজ করার পরিবর্তে শেলের বিরুদ্ধে লড়াই করছেন। সে কারণেই, নীচে আমার উত্তরে আমি শর্তাদির সাথে ডিলিমিটারকে যুক্ত হওয়ার শোধ করলাম।
তবুও আরেকটি সমাধান:
#!/bin/bash
foo=('foo bar' 'foo baz' 'bar baz')
bar=$(printf ",%s" "${foo[@]}")
bar=${bar:1}
echo $bar
সম্পাদনা: একই তবে বহু-চরিত্রের পরিবর্তনশীল দৈর্ঘ্যের বিভাজকের জন্য:
#!/bin/bash
separator=")|(" # e.g. constructing regex, pray it does not contain %s
foo=('foo bar' 'foo baz' 'bar baz')
regex="$( printf "${separator}%s" "${foo[@]}" )"
regex="${regex:${#separator}}" # remove leading separator
echo "${regex}"
# Prints: foo bar)|(foo baz)|(bar baz
printf -v bar ",%s" "${foo[@]}"
। এটি একটি fork
কম (আসলে clone
)। এটি এমনকি একটি ফাইল পড়া forking হয়: printf -v bar ",%s" $(<infile)
।
$separator
ধারণ করে না %s
বা এই ধরনের, আপনি আপনার করতে পারেন printf
শক্তসমর্থ: printf "%s%s" "$separator" "${foo[@]}"
।
printf "%s%s"
প্রথমত শুধুমাত্র আউটপুট সেট বিভাজক ব্যবহার করেন এবং তারপর কেবল আর্গুমেন্ট বাকি কনক্যাটেনেট।
printf "%s" "${foo[@]/#/$separator}"
।
IFS=; regex="${foo[*]/#/$separator}"
। এই মুহুর্তে এটি মূলত gniourf_gniourf এর উত্তরে পরিণত হয় যা আইএমও শুরু থেকেই পরিষ্কার, অর্থাৎ আইএফএস পরিবর্তন এবং টেম্প ওয়ার্সের পরিধি সীমাবদ্ধ করতে ফাংশন ব্যবহার করে।
$ foo=(a "b c" d)
$ bar=$(IFS=, ; echo "${foo[*]}")
$ echo "$bar"
a,b c,d
bar=$( IFS=, ; echo "${foo[*]}" )
@
পরিবর্তে *
, হিসাবে $(IFS=, ; echo "${foo[@]}")
? আমি দেখতে পাচ্ছি যে *
ইতিমধ্যে উপাদানগুলির মধ্যে শ্বেত স্থান সংরক্ষণ করেছে, আবার নিশ্চিত নয় কীভাবে, যেহেতু @
সাধারণত এই কারণে প্রয়োজন হয়।
*
। বাশ ম্যান পৃষ্ঠায়, "বিশেষ পরামিতি" অনুসন্ধান করুন এবং এর পরবর্তী ব্যাখ্যাটি দেখুন *
:
হতে পারে, যেমন,
SAVE_IFS="$IFS"
IFS=","
FOOJOIN="${FOO[*]}"
IFS="$SAVE_IFS"
echo "$FOOJOIN"
echo "-${IFS}-"
(কোঁকড়ানো ধনুর্বন্ধনী বক্রবন্ধগুলি পরিবর্তনশীল নাম থেকে ড্যাশগুলি পৃথক করে)।
echo $IFS
একই জিনিস আছে।
আশ্চর্যজনকভাবে আমার সমাধানটি এখনও দেওয়া হয়নি :) এটি আমার পক্ষে সহজতম উপায়। এটির জন্য কোনও ক্রিয়াকলাপের প্রয়োজন নেই:
IFS=, eval 'joined="${foo[*]}"'
দ্রষ্টব্য: এই সমাধানটি নন-পসিক্স মোডে ভালভাবে কাজ করতে দেখা গেছে। ইন POSIX মোড উপাদান এখনও সঠিকভাবে যোগ দেন কিন্তু হয় IFS=,
স্থায়ী হয়ে যায়।
এখানে কাজ করা 100% খাঁটি বাশ ফাংশন রয়েছে:
join() {
# $1 is return variable name
# $2 is sep
# $3... are the elements to join
local retname=$1 sep=$2 ret=$3
shift 3 || shift $(($#))
printf -v "$retname" "%s" "$ret${@/#/$sep}"
}
দেখুন:
$ a=( one two "three three" four five )
$ join joineda " and " "${a[@]}"
$ echo "$joineda"
one and two and three three and four and five
$ join joinedb randomsep "only one element"
$ echo "$joinedb"
only one element
$ join joinedc randomsep
$ echo "$joinedc"
$ a=( $' stuff with\nnewlines\n' $'and trailing newlines\n\n' )
$ join joineda $'a sep with\nnewlines\n' "${a[@]}"
$ echo "$joineda"
stuff with
newlines
a sep with
newlines
and trailing newlines
$
এটি এমনকি চলমান নতুন লাইনের সংরক্ষণ করে এবং ফাংশনটির ফলাফল পেতে একটি সাবশেলের প্রয়োজন হয় না। আপনি যদি পছন্দ করেন না printf -v
(কেন আপনি এটি পছন্দ করবেন না?) এবং একটি ভেরিয়েবলের নামটি পাস করার পরে, আপনি অবশ্যই ফিরে আসা স্ট্রিংয়ের জন্য একটি গ্লোবাল ভেরিয়েবল ব্যবহার করতে পারেন:
join() {
# $1 is sep
# $2... are the elements to join
# return is in global variable join_ret
local sep=$1 IFS=
join_ret=$2
shift 2 || shift $(($#))
join_ret+="${*/#/$sep}"
}
join_ret
একটি স্থানীয় ভেরিয়েবল তৈরি করে এবং আরও শেষে এটি প্রতিধ্বনি করে ক্লিনার হিসাবে তৈরি করা যেতে পারে । এটি শেল স্ক্রিপ্টিংয়ের মতো সাধারণ শেল স্ক্রিপ্টিং উপায়ে যোগ করতে () যোগদানের অনুমতি দেয় $(join ":" one two three)
এবং বৈশ্বিক ভেরিয়েবলের প্রয়োজন হয় না।
$(...)
নতুন লাইন trailing ট্রিম; সুতরাং অ্যারের শেষ ক্ষেত্রটিতে যদি নতুন লাইনের চিহ্ন থাকে তবে এগুলি ছাঁটাই করা হবে (ডেমো দেখুন যেখানে তারা আমার নকশাটি ছাঁটাচ্ছেন না)।
এটি বিদ্যমান বিদ্যমান সমাধানগুলির চেয়ে খুব বেশি আলাদা নয়, তবে এটি একটি পৃথক ফাংশন ব্যবহার করা এড়িয়ে IFS
যায়, প্যারেন্ট শেলটিতে কোনও পরিবর্তন হয় না এবং সব কিছুই একক লাইনে থাকে:
arr=(a b c)
printf '%s\n' "$(IFS=,; printf '%s' "${arr[*]}")"
ফলস্বরূপ
a,b,c
সীমাবদ্ধতা: বিভাজক এক অক্ষরের চেয়ে বেশি হতে পারে না।
কোন বাহ্যিক আদেশ ব্যবহার করে:
$ FOO=( a b c ) # initialize the array
$ BAR=${FOO[@]} # create a space delimited string from array
$ BAZ=${BAR// /,} # use parameter expansion to substitute spaces with comma
$ echo $BAZ
a,b,c
সতর্কতা, এটি ধরে নিয়েছে যে উপাদানগুলির সাদা অংশ নেই।
echo ${FOO[@]} | tr ' ' ','
আমি স্ট্রিং হিসাবে অ্যারে প্রতিধ্বনি করব, তারপরে স্পেসগুলি লাইন ফিডে রূপান্তরিত করব এবং তারপরে paste
একটি লাইনে সমস্ত কিছুতে যোগ দেওয়ার জন্য এটি ব্যবহার করব :
tr " " "\n" <<< "$FOO" | paste -sd , -
ফলাফল:
a,b,c
এটি আমার কাছে দ্রুত এবং সবচেয়ে পরিষ্কার বলে মনে হচ্ছে!
$FOO
যদিও অ্যারের প্রথম উপাদানটি। এছাড়াও, ফাঁকা স্থান যুক্ত অ্যারে উপাদানগুলির জন্য এটি বিরতি দেয়।
@ এর পুনরায় ব্যবহারের সাথে সমাধানের বিষয়টি বিবেচনা করে না তবে $ {: 1} সাবস্টিটিশন এবং মধ্যস্থতাকারের পরিবর্তনশীলের প্রয়োজনীয়তা এড়িয়ে একটি বিবৃতি দিয়ে।
echo $(printf "%s," "${LIST[@]}" | cut -d "," -f 1-${#LIST[@]} )
প্রিন্টফের রয়েছে 'আর্গুমেন্টগুলি পূরণ করার জন্য ফর্ম্যাট স্ট্রিংটি প্রায়শই প্রয়োজন হিসাবে পুনরায় ব্যবহৃত হয়।' এর ম্যান পৃষ্ঠাগুলিতে, যাতে স্ট্রিংগুলির সংক্ষেপণ নথিভুক্ত হয়। তারপরে কৌশলটি হ'ল তালিকাটির দৈর্ঘ্যটি শেষ স্প্রেটারটি কাটাতে ব্যবহার করা হবে, যেহেতু কাটা ক্ষেত্রের গণনা হিসাবে কেবলমাত্র LIST এর দৈর্ঘ্য ধরে রাখতে পারে।
s=$(IFS=, eval 'echo "${FOO[*]}"')
@Q
হওয়ার সাথে যুক্ত হওয়া মানগুলি যখন তাদের সাথে যুক্ত হতে পারে তখন তাদের ভুল ব্যাখ্যা করা থেকে বাঁচতে পারে: foo=("a ," "b ' ' c" "' 'd e" "f " ";" "ls -latr"); s=$(IFS=, eval 'echo "${foo[*]@Q}"'); echo "${s}"
ফলাফলগুলি'a ,','b '\'' '\'' c',''\'' '\''d e','f ',';','ls -latr '
প্রিন্টফ সমাধান যা কোনও দৈর্ঘ্যের বিভাজককে স্বীকার করে (@ এর উপর ভিত্তি করে জবাব দেয় না)
#/!bin/bash
foo=('foo bar' 'foo baz' 'bar baz')
sep=',' # can be of any length
bar=$(printf "${sep}%s" "${foo[@]}")
bar=${bar:${#sep}}
echo $bar
printf
ফর্ম্যাট স্পেসিফায়ার (উদাহরণস্বরূপ %s
অনিচ্ছাকৃতভাবে $sep
সমস্যার কারণ হবে
sep
সঙ্গে স্যানিটাইজ করা যেতে পারে ${sep//\%/%%}
। আমি তার চেয়ে উত্তম আপনার সমাধান মত ${bar#${sep}}
বা ${bar%${sep}}
(বিকল্প)। এটি এমন কোনও ফাংশনে রূপান্তরিত হয় যা জেনেরিক ভেরিয়েবলের মতো ফলাফল সঞ্চয় করে __
এবং echo
এটি না করে।
function join_by { printf -v __ "${1//\%/%%}%s" "${@:2}"; __=${__:${#1}}; }
$ set a 'b c' d
$ history -p "$@" | paste -sd,
a,b c,d
HISTSIZE=0
?
paste -sd,
ইতিহাসের ব্যবহার সম্পর্কে নয়।
HISTSIZE=0
এটি চেষ্টা করে - তবে এটি কার্যকর হবে না ।
শীর্ষ উত্তরের সংক্ষিপ্ত সংস্করণ:
joinStrings() { local a=("${@:3}"); printf "%s" "$2${a[@]/#/$1}"; }
ব্যবহার:
joinStrings "$myDelimiter" "${myArray[@]}"
join_strings () { local d="$1"; echo -n "$2"; shift 2 && printf '%s' "${@/#/$d}"; }
join_strings () { local d="$1"; echo -n "$2"; shift 2 && printf '$d%s' "${@}"; }
এটি ব্যবহারের সাথে কাজ করে: join_strings 'delim' "${array[@]}"
বা অব্যক্ত:join_strings 'delim' ${array[@]}
নীচের ধারণার সাথে এখন পর্যন্ত সমস্ত বিশ্বের সেরা একত্রিত করুন।
# join with separator
join_ws() { local IFS=; local s="${*/#/$1}"; echo "${s#"$1$1$1"}"; }
এই ছোট্ট মাস্টারপিসটি হ'ল
উদাহরণ:
$ join_ws , a b c
a,b,c
$ join_ws '' a b c
abc
$ join_ws $'\n' a b c
a
b
c
$ join_ws ' \/ ' A B C
A \/ B \/ C
join_ws ,
(কোনও যুক্তি ছাড়াই) ভুল আউটপুট ,,
। ২. join_ws , -e
ভুলভাবে কিছুই আউটপুট করে না (কারণ আপনি এর echo
পরিবর্তে ভুলভাবে ব্যবহার করছেন printf
)। এর echo
পরিবর্তে আপনি কেন বিজ্ঞাপনটির বিজ্ঞাপন দিয়েছেন তা আমি জানি না printf
: echo
কুখ্যাতভাবে ভেঙে গেছে, এবং printf
এটি শক্তিশালী অন্তর্নির্মিত।
এখনই আমি ব্যবহার করছি:
TO_IGNORE=(
E201 # Whitespace after '('
E301 # Expected N blank lines, found M
E303 # Too many blank lines (pep8 gets confused by comments)
)
ARGS="--ignore `echo ${TO_IGNORE[@]} | tr ' ' ','`"
যা কাজ করে, তবে (সাধারণ ক্ষেত্রে) অ্যারে উপাদানগুলির মধ্যে স্থান থাকলে ভয়াবহভাবে ভেঙে যায়।
(যারা আগ্রহী তাদের জন্য এটি pep8.py এর চারপাশে একটি মোড়ক স্ক্রিপ্ট )
ARGS="--ignore $(echo "${TO_IGNORE[@]}" | tr ' ' ',')"
। অপারেটর $()
backtics (এর পাখির অনুমতি দেয় অপেক্ষা অধিক শক্তিধর কে $()
এবং ""
)। ${TO_IGNORE[@]}
ডাবল উদ্ধৃতি দিয়ে মোড়ানোও সহায়তা করা উচিত।
মাল্টিচার্যাক্টর বিভাজকগুলির জন্য পার্ল ব্যবহার করুন:
function join {
perl -e '$s = shift @ARGV; print join($s, @ARGV);' "$@";
}
join ', ' a b c # a, b, c
বা এক লাইনে:
perl -le 'print join(shift, @ARGV);' ', ' 1 2 3
1, 2, 3
join
নামটি কিছু ছদ্মবেশের সাথে দ্বন্দ্ব বোধ করে OS X
.. আমি এটি ডাকব conjoined
, না হতে পারে jackie_joyner_kersee
?
আমার এখন পর্যন্ত সেরা বিশ্বের সংমিশ্রণের বিষয়ে বিস্তারিত মন্তব্যের জন্য @gniourf_gniourf ধন্যবাদ। পোষ্টিং কোডের জন্য দুঃখিত, পুরোপুরি ডিজাইন এবং পরীক্ষা করা হয়নি। আরও ভাল চেষ্টা এখানে।
# join with separator
join_ws() { local d=$1 s=$2; shift 2 && printf %s "$s${@/#/$d}"; }
ধারণা দ্বারা এই সৌন্দর্য হয়
অতিরিক্ত উদাহরণ:
$ join_ws '' a b c
abc
$ join_ws ':' {1,7}{A..C}
1A:1B:1C:7A:7B:7C
$ join_ws -e -e
-e
$ join_ws $'\033[F' $'\n\n\n' 1. 2. 3. $'\n\n\n\n'
3.
2.
1.
$ join_ws $
$
আপনি যে উপাদানগুলিতে যোগ দিতে চান সেগুলি অ্যারে না হয়ে কেবল স্থান পৃথকী স্ট্রিংয়ের সাথে আপনি এই জাতীয় কিছু করতে পারেন:
foo="aa bb cc dd"
bar=`for i in $foo; do printf ",'%s'" $i; done`
bar=${bar:1}
echo $bar
'aa','bb','cc','dd'
উদাহরণস্বরূপ, আমার ব্যবহারের ক্ষেত্রেটি হ'ল যে আমার শেল স্ক্রিপ্টে কিছু স্ট্রিং উত্তীর্ণ হয়েছে এবং এসকিউএল কোয়েরিতে চালানোর জন্য আমার এটি ব্যবহার করতে হবে:
./my_script "aa bb cc dd"
মাই_সক্রিপ্টে, আমাকে "সারণি * সারণী থেকে কোথাও নাম ('এএ', 'বিবি', 'সিসি', 'ডিডি') করতে হবে Then তারপরে উপরের আদেশটি কার্যকর হবে be
printf -v bar ...
একটি সাবশেলে প্রিন্টফ লুপ চালানোর পরিবর্তে এবং আউটপুট ক্যাপচার করতে পারেন।
এখানে বেশিরভাগ পসিএক্স সামঞ্জস্যপূর্ণ শেলগুলি সমর্থন করে:
join_by() {
# Usage: join_by "||" a b c d
local arg arr=() sep="$1"
shift
for arg in "$@"; do
if [ 0 -lt "${#arr[@]}" ]; then
arr+=("${sep}")
fi
arr+=("${arg}") || break
done
printf "%s" "${arr[@]}"
}
ভেরিয়েবল ইন্ডিয়ারেশন ব্যবহার করে সরাসরি অ্যারে রেফারেন্স করতেও কাজ করে। নামযুক্ত রেফারেন্সগুলিও ব্যবহার করা যেতে পারে তবে সেগুলি কেবল ৪.৩-এ উপলব্ধ হয়েছিল।
কোনও ফাংশনের এই ফর্মটি ব্যবহার করার সুবিধাটি হ'ল আপনি বিভাজক optionচ্ছিক (ডিফল্টের প্রথম অক্ষরের ডিফল্ট IFS
, যা একটি স্থান; এটি যদি আপনি চান তবে খালি স্ট্রিং হিসাবে তৈরি করতে পারেন), এবং এটি দুটি বারের মানকে প্রসারিত করা এড়াতে পারে (প্রথম যখন পরামিতি হিসাবে পাস, এবং দ্বিতীয় হিসাবে"$@"
ফাংশন ভিতরে )।
এই সমাধানটিতে ব্যবহারকারীকে কোনও কমান্ড প্রতিস্থাপনের ভিতরে ফাংশনটি কল করার প্রয়োজন হয় না - যা অন্য ভেরিয়েবলের জন্য নির্ধারিত স্ট্রিংয়ের একটি যুক্ত সংস্করণ পেতে একটি সাবসেল তলব করে।
function join_by_ref {
__=
local __r=$1[@] __s=${2-' '}
printf -v __ "${__s//\%/%%}%s" "${!__r}"
__=${__:${#__s}}
}
array=(1 2 3 4)
join_by_ref array
echo "$__" # Prints '1 2 3 4'.
join_by_ref array '%s'
echo "$__" # Prints '1%s2%s3%s4'.
join_by_ref 'invalid*' '%s' # Bash 4.4 shows "invalid*[@]: bad substitution".
echo "$__" # Prints nothing but newline.
ফাংশনটির জন্য আরও আরামদায়ক নামটি নির্দ্বিধায় ব্যবহার করুন।
এটি 3.1 থেকে 5.0-আলফা পর্যন্ত কাজ করে। যেমন পর্যবেক্ষণ করা হয়েছে, ভেরিয়েবল ইন্ডিরিশন কেবল ভেরিয়েবলের সাথেই কাজ করে না তবে অন্যান্য পরামিতিগুলির সাথেও কাজ করে।
প্যারামিটার হ'ল একটি সত্তা যা মানগুলি সঞ্চয় করে। এটি নাম, একটি সংখ্যা বা বিশেষ প্যারামিটারগুলির নীচে তালিকাভুক্ত বিশেষ অক্ষরের একটি হতে পারে। একটি ভেরিয়েবল একটি প্যারামিটার যা নামের দ্বারা চিহ্নিত করা হয়।
অ্যারে এবং অ্যারে উপাদানগুলি প্যারামিটারগুলিও রয়েছে (সত্ত্বাগুলি যেগুলি মূল্য দেয়) এবং অ্যারের উল্লেখগুলি প্রযুক্তিগতভাবে পরামিতিগুলিরও উল্লেখ। এবং অনেকটা বিশেষ প্যারামিটারের মতো @
,array[@]
এছাড়াও একটি বৈধ উল্লেখ করে না।
পরিবর্তনের পরিবর্তিত বা নির্বাচনী ফর্মগুলি (সাবস্ট্রিং সম্প্রসারণের মতো) যা পরামিতি থেকে রেফারেন্সকে বিচ্যুত করে আর কাজ করে না।
বাশ 5.0 এর রিলিজ সংস্করণে, পরিবর্তনশীল ইন্ডিরেশনকে ইতিমধ্যে পরোক্ষ সম্প্রসারণ বলা হয় এবং এর আচরণটি স্বতন্ত্রভাবে ম্যানুয়ালটিতে নথিভুক্ত করা হয়েছে:
যদি প্যারামিটারের প্রথম অক্ষরটি একটি বিস্ময়কর বিন্দু (!) হয় এবং পরামিতি নামরেফ না হয় তবে এটি ইন্ডিয়ারেশনের একটি স্তর প্রবর্তন করে। বাশ বাকী প্যারামিটারটিকে নতুন প্যারামিটার হিসাবে প্রসারিত করে গঠিত মান ব্যবহার করে; এটির পরে প্রসারিত হয় এবং সেই মানটি মূল প্যারামিটারের প্রসারণের পরিবর্তে বাকী প্রসারণে ব্যবহৃত হয়। এটি পরোক্ষ সম্প্রসারণ হিসাবে পরিচিত।
দয়া করে মনে রাখবেন ডকুমেন্টেশন মধ্যে গ্রহণ ${parameter}
, parameter
হিসাবে উল্লেখ করা হয় "বর্ণনা (IN) হিসাবে একটি শেল প্যারামিটার প্যারামিটার অথবা একটি অ্যারের রেফারেন্স "। এবং অ্যারের ডকুমেন্টেশনে এটি উল্লেখ করা হয়েছে যে "অ্যারের কোনও উপাদান ব্যবহার করে রেফারেন্স করা যেতে পারে ${name[subscript]}
"। এটা তৈরি করে__r[@]
একটি অ্যারে রেফারেন্স তৈরি করে।
আমার দেখুন মন্তব্য মধ্যে Riccardo Galli এর উত্তর ।
__
একটি পরিবর্তনশীল নাম হিসাবে ব্যবহার করার কোনও নির্দিষ্ট কারণ আছে ? কোডটি সত্যিই অপঠনযোগ্য করে তোলে।
আপনি যদি লুপে অ্যারে তৈরি করেন তবে এখানে একটি সহজ উপায়:
arr=()
for x in $(some_cmd); do
arr+=($x,)
done
arr[-1]=${arr[-1]%,}
echo ${arr[*]}
x=${"${arr[*]}"// /,}
এটি এটি করার সবচেয়ে সংক্ষিপ্ততম উপায়।
উদাহরণ,
arr=(1 2 3 4 5)
x=${"${arr[*]}"// /,}
echo $x # output: 1,2,3,4,5
bash: ${"${arr[*]}"// /,}: bad substitution
সম্ভবত আমি স্পষ্ট কিছু মিস করছি, যেহেতু আমি পুরো বাশ / zsh জিনিসটির জন্য একটি নতুন, তবে এটি আমার কাছে এমন মনে হচ্ছে যে আপনাকে কোনও ব্যবহার printf
করার দরকার নেই । বা এটি ছাড়া সত্যিই কুৎসিত হয় না।
join() {
separator=$1
arr=$*
arr=${arr:2} # throw away separator and following space
arr=${arr// /$separator}
}
কমপক্ষে, এটি আমার পক্ষে এতদিন ইস্যু ছাড়াই কাজ করেছে।
উদাহরণস্বরূপ, join \| *.sh
যা বলা যাক আমি আমার ~
ডিরেক্টরিতে আউটপুট utilities.sh|play.sh|foobar.sh
। আমার জন্য যথেষ্ট ভাল।
সম্পাদনা: এটি মূলত নীল গিসওইলারের উত্তর , তবে একটি ফাংশনে সাধারণীকরণ।
liststr=""
for item in list
do
liststr=$item,$liststr
done
LEN=`expr length $liststr`
LEN=`expr $LEN - 1`
liststr=${liststr:0:$LEN}
এটি শেষেও অতিরিক্ত কমা যত্ন নেবে। আমি কোন বাশ বিশেষজ্ঞ নই। কেবল আমার 2 সি, যেহেতু এটি আরও প্রাথমিক এবং বোধগম্য