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


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.