কমান্ড লাইন আর্গুমেন্টগুলিকে বাশের একটি অ্যারেতে রূপান্তর করুন


160

আমি কীভাবে কমান্ড-লাইন আর্গুমেন্টগুলিকে বাশ স্ক্রিপ্ট অ্যারে রূপান্তর করব?

আমি এটি নিতে চাই:

./something.sh arg1 arg2 arg3

এবং এটি রূপান্তর

myArray=( arg1 arg2 arg3 )

যাতে আমি স্ক্রিপ্টে আরও ব্যবহারের জন্য মাইআরিকে ব্যবহার করতে পারি।

পূর্ববর্তী এসও পোস্টটি নিকটে আসে, তবে কীভাবে অ্যারে তৈরি করবেন তা যায় না: আমি কীভাবে কমান্ড লাইন যুক্তিকে পার্স করব?

আমার তর্কগুলি নিয়মিত বাশ স্ক্রিপ্ট অ্যারে রূপান্তর করা দরকার; আমি বুঝতে পারি আমি অন্যান্য ভাষা ব্যবহার করতে পারি (উদাহরণস্বরূপ, পাইথন) তবে ব্যাশ করে এটি করা দরকার। আমার ধারণা আমি একটি "সংযোজন" ফাংশন বা অনুরূপ কিছু খুঁজছি?

আপডেট: আমি শূন্য আর্গুমেন্টগুলির জন্য কীভাবে চেক করতে এবং একটি ডিফল্ট অ্যারে মান নির্ধারণ করতে চেয়েছিলাম এবং নীচের উত্তরের জন্য ধন্যবাদ এই কাজটি করতে সক্ষম হয়েছিল:

if [ "$#" -eq 0 ]; then
  myArray=( defaultarg1 defaultarg2 )
else
  myArray=( "$@" )
fi

উত্তর:


206

আসলে আপনার কমান্ড লাইন আর্গুমেন্ট কার্যত ইতিমধ্যে একটি অ্যারে মত। কমপক্ষে, আপনি $@ভেরিয়েবলটিকে অনেকটা অ্যারের মতো আচরণ করতে পারেন । এটি বলেছিল, আপনি এটিকে এটির মতো একটি প্রকৃত অ্যারেতে রূপান্তর করতে পারেন:

myArray=( "$@" )

আপনি যদি কিছু আর্গুমেন্ট টাইপ করতে চান এবং মানটিতে ফিড $@করতে চান তবে set:

$ set -- apple banana "kiwi fruit"
$ echo "$#"
3
$ echo "$@"
apple banana kiwi fruit

আর্গুমেন্ট স্ট্রাকচার কীভাবে ব্যবহার করবেন তা বোঝা POSIX sh এ বিশেষভাবে কার্যকর, যার অ্যারের মতো আর কিছুই নেই।


2
ধন্যবাদ! দুর্দান্ত কাজ! শূন্য আর্গুমেন্টগুলির জন্য কীভাবে চেক করতে হবে এবং একটি ডিফল্ট অ্যারে মান নির্ধারণ করতে হবে, এবং and # এটির জন্য পুরোপুরি কাজ করে!
— সুমন

1
setসুযোগের জন্য আপনাকে অবস্থানগত পরামিতি সেট করতে দেয়। এটি আপনাকে শেল বিকল্পগুলি সেট করতে দেয়। আপনি এটি করতে পারেন set foo, যার অর্থ $1"ফু" এ প্রসারিত হবে , তবে যদি আপনার পরামিতিগুলি কোনও ড্যাশ দিয়ে শুরু হয় setতবে ধরে নেবেন আপনি শেল বিকল্পটি সেট করার অর্থ। ডাবল-ড্যাশ নিশ্চিত করে যে নীচের সমস্ত পরামিতিগুলি স্থিতিগত পরামিতিগুলি সেট করতে হবে।
— কোজিরো

11
একটি গোছা: echo $@সমস্ত আর্গুমেন্ট echo $myArrayমুদ্রণ করবে , তবে কেবল প্রথম উপাদানটি মুদ্রণ করবে। তাদের সমস্ত দেখতে, ব্যবহার করুন echo ${myArray[@]}।
— z0r

4
@ z0r আপনি যদি এই বিস্তারের চারপাশে দ্বিগুণ উদ্ধৃতি না রাখেন তবে বাশ এগুলিকে পুনরায় শব্দযুক্ত করবে এবং সম্ভবত অর্থ হারাবে।
— কোজিরো

ঠিক আছে, একটি অ্যারে "স্প্ল্যাট" করার এবং প্রতিটি উপাদান ব্যবহারের সাধারণ উপায় হ'ল "${myArray[@]}"। আপনি যদি অ্যারের মধ্য দিয়ে লুপ করতে চান তবে আইএফএসে এর পৃথক উপাদানগুলিকে বিভক্ত করা এড়াতে আপনার উদ্ধৃতিগুলি দরকার
— বলপয়েন্টবিউন

66

হতে পারে এটি সাহায্য করতে পারে:

myArray=("$@") 

এছাড়াও আপনি 'ইন' বাদ দিয়ে যুক্তিগুলি নিয়ে পুনরাবৃত্তি করতে পারেন:

for arg; do
   echo "$arg"
done

সমান হবে

for arg in "${myArray[@]}"; do
   echo "$arg"
done

3
নবাগত প্রশ্ন: বাশ argমাঠে কী রাখবে তা কীভাবে জানতে পারে - এটি কি পূর্বনির্ধারিত পরিবর্তনশীল? ${var}এর সামগ্রীতে প্রসারিত হয় var। অ্যারের ${var[n]}উপাদানের সামগ্রীতে প্রসারিত হয় । তারপরে কি পুরো অ্যারেটি প্রসারিত করা হবে, অর্থাৎ ( শেষ উপাদানটির সূচক সহ)? nvar${var[@]}${var[0]} ${var[1]} ... ${var[n]}n
— খ্রিস্টান

4
[জন্য] [ইন] ছাড়াই আর্গুমেন্ট অ্যারে lo @ ($ 1, $ 2 ইত্যাদি) লুপ করবে। যা [সেট] কমান্ডের সাহায্যেও সেট করা যেতে পারে, উদাহরণস্বরূপ সেট - arg1 arg2
— নাহুয়েল ফিউইলুল

17

প্রকৃতপক্ষে প্যারামিটারগুলির তালিকাটি অ্যাক্সেস করা যেতে পারে $1 $2 ...ইত্যাদি
যা ঠিক এর সমতুল্য:

${!i}

সুতরাং, পরামিতিগুলির তালিকাটি সেট সহ পরিবর্তন করা যেতে পারে
এবং ${!i}এগুলি অ্যাক্সেস করার সঠিক উপায়:

$ set -- aa bb cc dd 55 ff gg hh ii jjj kkk lll
$ for ((i=0;i<=$#;i++)); do echo "$#" "$i" "${!i}"; done
12 1 aa
12 2 bb
12 3 cc
12 4 dd
12 5 55
12 6 ff
12 7 gg
12 8 hh
12 9 ii
12 10 jjj
12 11 kkk
12 12 lll

আপনার নির্দিষ্ট কেসের জন্য, এটি ব্যবহার করা যেতে পারে (অ্যারেগুলির প্রয়োজন ছাড়াই), যখন কোনও কিছুই দেওয়া হয়নি তখন আর্গুমেন্টের তালিকা সেট করতে:

if [ "$#" -eq 0 ]; then
    set -- defaultarg1 defaultarg2
fi

যা এই এমনকি সহজ অভিব্যক্তি অনুবাদ করে:

[ "$#" == "0" ] && set -- defaultarg1 defaultarg2

প্রতিধ্বনি উদাহরণটি হওয়া উচিত নয়: echo "$#" "$i+1" "${!i}";আউটপুট ঠিক যেমন প্রদর্শিত হয় তা পেতে?
— জায়েল

6

এখানে অন্য ব্যবহার:

#!/bin/bash
array=( "$@" )
arraylength=${#array[@]}
for (( i=0; i<${arraylength}; i++ ));
do
   echo "${array[$i]}"
done

4

আরও সহজ, আপনি সরাসরি চালনা করতে পারবেন $@;)

এখানে প্রম্পট থেকে সরাসরি আর্গগুলির তালিকা কীভাবে পাস করবেন তা এখানে:

function echoarg { for stuff in "$@" ; do echo $stuff ; done ; } 
    echoarg Hey Ho Lets Go
    Hey
    Ho
    Lets
    Go

1
এমনকি সহজ, :)for stuff in "$@" ; do ...for stuff ; do ...
— কেকেএম

1

পাশাপাশি অ্যারে এবং $ @ কার্যত একরকমের দিকনির্দেশ দেখুন।

কোড:

#!/bin/bash

echo "Dollar-1 : $1"
echo "Dollar-2 : $2"
echo "Dollar-3 : $3"
echo "Dollar-AT: $@"
echo ""

myArray=( "$@" )

echo "A Val 0: ${myArray[0]}"
echo "A Val 1: ${myArray[1]}"
echo "A Val 2: ${myArray[2]}"
echo "A All Values: ${myArray[@]}"

ইনপুট:

./bash-array-practice.sh 1 2 3 4

আউটপুট:

Dollar-1 : 1
Dollar-2 : 2
Dollar-3 : 3
Dollar-AT: 1 2 3 4

A Val 0: 1
A Val 1: 2
A Val 2: 3
A All Values: 1 2 3 4

1

ডাবল উদ্ধৃতিগুলির গুরুত্ব জোর দেওয়ার মতো। মনে করুন কোনও যুক্তিতে সাদা স্থান রয়েছে।

কোড:

#!/bin/bash
printf 'arguments:%s\n' "$@"
declare -a arrayGOOD=( "$@" )
declare -a arrayBAAD=(  $@  )

printf '\n%s:\n' arrayGOOD
declare -p arrayGOOD
arrayGOODlength=${#arrayGOOD[@]}
for (( i=1; i<${arrayGOODlength}+1; i++ ));
do
   echo "${arrayGOOD[$i-1]}"
done

printf '\n%s:\n' arrayBAAD
declare -p arrayBAAD
arrayBAADlength=${#arrayBAAD[@]}
for (( i=1; i<${arrayBAADlength}+1; i++ ));
do
   echo "${arrayBAAD[$i-1]}"
done

আউটপুট:

> ./bash-array-practice.sh 'The dog ate the "flea" -- and ' the mouse.
arguments:The dog ate the "flea" -- and 
arguments:the
arguments:mouse.

arrayGOOD:
declare -a arrayGOOD='([0]="The dog ate the \"flea\" -- and " [1]="the" [2]="mouse.")'
The dog ate the "flea" -- and 
the
mouse.

arrayBAAD:
declare -a arrayBAAD='([0]="The" [1]="dog" [2]="ate" [3]="the" [4]="\"flea\"" [5]="--" [6]="and" [7]="the" [8]="mouse.")'
The
dog
ate
the
"flea"
--
and
the
mouse.
> 
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.