আমি সিকোয়েন্সের শেল ব্রেস প্রসারণে কীভাবে $ ভেরিয়েবল ব্যবহার করতে পারি?


33

আমি $var inব্যাশে ব্যাপ্তিতে একটি শেল ব্রেস সম্প্রসারণ ব্যবহার করতে চাই । সহজভাবে নির্বাণ {$var1..$var2}কাজ করে না, তাই আমি "পার্শ্ববর্তী" ...

নিম্নলিখিতগুলি কাজ করে তবে এটি কিছুটা ক্লডজি।

# remove the split files
echo rm foo.{$ext0..$extN} rm-segments > rm-segments
source rm-segments

আরও "স্বাভাবিক" উপায় আছে?

উত্তর:


26

আপনি চেষ্টা করতে পারেন:

eval rm foo.{$ext0..$extN}

এটি সেরা উত্তর কিনা তা নিশ্চিত নন তবে এটি অবশ্যই একটি।


Durrh! :( আমি সুস্পষ্ট দেখতে পেলাম না ... ধন্যবাদ :)
পিটার.ও

4
ব্যাশে, প্রসারণের আগে}} সম্প্রসারণ ঘটে, সুতরাং আমি মনে করি না যে এক্সপ্রেশনটির মধ্য দিয়ে দুটি পাসের জন্য ইওল বা অন্য কোনও কৌশল ব্যবহার করা ছাড়া এটি করার অন্য কোনও উপায় নেই।
ম্যাচটিএম

6
আমি কেবল এটি "পেয়েছি"! ... সাথে কোনও ব্রেস সম্প্রসারণ নেই{$one..$three} , কারণ এটি ব্রেস-প্রসারণের বৈধ রূপ নয়, যা এই ক্ষেত্রে পূর্ণসংখ্যার প্রত্যাশা করে ... এটি কেবল expansion var প্রসারণের পরে বৈধ রূপে পরিণত হয়, যা evalপরে সাধারণ ব্রেস ক্রম সম্প্রসারণ প্রসারণের জন্য একই প্রক্রিয়াটির মধ্য দিয়ে যায় ... 1 2 3 কিউইডি;) ... সংক্ষিপ্তসার: একটি ব্রেস জোড়ের সহজ উপস্থিতি ব্রেস সম্প্রসারণকে ট্রিগার করে না ... কেবলমাত্র একটি বৈধ ফর্ম এটি ট্রিগার করে ।
পিটার.ও

@fred: স্বাগতম :-)
asoundmove

কোনও ভেরিয়েবল ব্যবহার করার সময় a={0..9}; echo $a;কোনও ব্রেস এক্সটেনশন নেই । ব্যবহার করে eval, এটি কাজ করে। সুতরাং আমি মনে করি @ ম্যাটডেমের ব্যাখ্যাটি ভাল।
dr0i

20

আপনি ইতিমধ্যে উপলব্ধি হিসাবে, ব্রেস প্রসারণ কিন্তু {1..3}প্রসারিত বা না ট্রিগার, এবং পরেরটি পরে এবং প্রতিস্থাপন এবং তাদের মান দ্বারা প্রসারিত হয় ।1 2 3{foo..bar}{$foo..$bar}$foo$bar

জিএনইউতে একটি ফ্যালব্যাক (উদাহরণস্বরূপ নন-এমবেডড লিনাক্স) হ'ল seqকমান্ড।

for x in `seq $ext0 $extN`; do rm foo.$x; done

আর একটি সম্ভাবনা। যদি foo.কোন শেল বিশেষ অক্ষর আছে, হয়

rm `seq $ext0 $extN | sed 's/^/foo./'`

সবচেয়ে সহজ সমাধানটি হল zsh ব্যবহার করা, rm foo.{$ext0..$extN}আপনি যা চান তা কোথায় করে does


বিকল্পগুলির জন্য ধন্যবাদ .. এগুলি সকলকে দলবদ্ধ করে দেখানো ভাল I'll সুতরাং এটি আর সমস্যা নেই। রাইডারের কারণে ভাল ঘোড়া পরিবর্তন করার দরকার নেই:) ...
পিটার.ও

1

অন্যান্য উত্তর ব্যবহার নিয়ে আলোচনা করার সময় evalএবং seqএ, bash, আপনি একটি ঐতিহ্যগত সি শৈলী ব্যবহার করতে পারেন forএকটি গাণিতিক প্রেক্ষাপটে লুপ। ভেরিয়েবল ext0এবং extNভিতরে প্রসারিত হয় ((..))পরিসর সংজ্ঞায়িত চালানোর লুপ সৃষ্টি হয়।

for (( idx = ext0; idx <= extN; idx++ )); do
    [[ -f "$foo.$idx" ]] || { printf "file %s does not exist" "$foo.$idx" >&2 ; continue }
    rm "$foo.$idx"
done

আপনি যদি সর্বোত্তম উপায়ে সন্ধান করছেন এবং একাধিক rmকমান্ড এড়ানোর জন্য আপনি ফাইলের নাম ফলাফল সংরক্ষণ করতে rmএবং এক শটে কল করতে একটি অস্থায়ী স্থানধারক ব্যবহার করতে পারেন ।

 results=()
 for (( idx = ext0; idx <= extN; idx++ )); do
     [[ -f "$foo.$idx" ]] || { printf "file %s does not exist" "$foo.$idx" >&2 ; continue }
     results+=( "$foo.$idx" )
 done

এবং এখন rmপ্রসারিত অ্যারে কমান্ড কল করুন

 rm -- "${results[@]}"

0
    function f_over_range {
        for i in $(eval echo {$1..$2}); do
            f $i
        done
    }

    function f {
        echo $1
    }

    f_over_range 0 5
    f_over_range 00 05

নোট:

  • Eval ব্যবহার কমান্ড ইঞ্জেকশন সুরক্ষা ঝুঁকি প্রকাশ করে
  • লিনাক্স "00 \ n01 \ n02..etc" প্রিন্ট করবে তবে ওএসএক্স "1 \ n2 \ n ... ইত্যাদি" প্রিন্ট করবে
  • লুপগুলির জন্য সিক বা সি-স্টাইল ব্যবহার করা অগ্রণী জিরোগুলির ব্রেস সম্প্রসারণের হ্যান্ডলিংয়ের সাথে মেলে না
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.