শেল প্যারামিটার ভেরিয়েবলগুলি ($ 1,…, $ @) সরাসরি সিএলআই-তে ব্যবহার করা কি সম্ভব?


9

কখনও কখনও ছোট উদাহরণগুলিতে উপরের ভেরিয়েবলগুলি অনুকরণ এবং যাচাই করা প্রয়োজন এবং তারপরে কিছু স্ক্রিপ্টে তাত্ক্ষণিক অনুলিপি করা যেতে পারে etc.

আমি নিম্নলিখিত উপায়ে একটি সাধারণ উদাহরণ ব্যবহার করে সমাধান করার চেষ্টা করেছি:

(find $1) /tmp
sh -c '(find $1) /tmp'
sh -c "find $1" /tmp
echo '(find $1) /tmp' | sh

এবং অন্যান্য সংমিশ্রণের সাথে। শেবাং দোভাষী নির্দেশিকা যুক্ত করে পরীক্ষা-নিরীক্ষাও করেছেন #!/bin/sh -x, তবে পছন্দসই ফলাফল পাননি।

আমি কি সহজভাবে এটি করতে পারি?


1
(find $1) /tmpএকটি সিনট্যাক্স ত্রুটি। আসলে (any-command) more-argumentsএকটি বাক্য গঠন ত্রুটি। আপনি যা করার চেষ্টা করছেন তা কি আলাদাভাবে ব্যাখ্যা করতে পারেন?
সেলেদা

2
@Celada তা শাঁস মধ্যে একটি বাক্য গঠন ত্রুটি নয় rcপরিবারটিই ( rc, es, akanga...), যে ক্ষেত্রে যে সমতুল্য যেখানে find $1 /tmp
স্টাফেন চেজেলাস

উত্তর:


15

এর পরে প্রথম যুক্তি sh -c inline-scriptযায় $0(যা ত্রুটির বার্তাগুলির জন্যও ব্যবহৃত হয়), এবং বাকীগুলি ভিতরে যায় $1, $2...

$ sh -c 'blah; echo "$0"; echo "$1"' my-inline-script arg
my-inline-script: blah: command not found
my-inline-script
arg

তাহলে তুমি চাও:

sh -c 'find "$1"' sh /tmp

(পুরানো দিনগুলিতে, আপনি shপ্রয়োগগুলি সন্ধান করতে পারেন যেখানে $1পরিবর্তে প্রথম আরগটি প্রবেশ করেছিল , তাই আপনি এটি করবেন:

sh -c 'find "$1"' /tmp /tmp

বা:

sh -c 'shift "$2"; find "$@"' sh 3 2 /tmp1 /tmp2

উভয় আচরণের জন্য অ্যাকাউন্ট করতে, কিন্তু পসিক্স প্রচলিত এবং প্রকাশ্যে উপলভ্য যে শেলগুলি এখন চলে গেছে)।


আপনি সেট করতে চান তাহলে $1, $2বর্তমান শেল মধ্যে একটি স্থানীয় সুযোগ, আপনি ফাংশন ব্যবহার করতে চাই কোথায়। বোর্নের মতো শেলগুলিতে:

my_func() {
  find "$1"
}
my_func /tmp

কিছু শেল বেনামে ফাংশন সমর্থন করে। এটি এরকম zsh:

(){find "$1"} /tmp

বা es:

@{find $1} /tmp

স্থায়ীভাবে বর্তমান অবস্থানিক পরামিতিগুলি পরিবর্তন করতে সিনট্যাক্সটি শেল নির্ভর। dchirikov ইতিমধ্যে আবৃত করেছে বোর্ন মত শাঁস (বোর্ন, Korn থেকে, bash, zsh, POSIX, ash, yash...)।

বাক্য গঠনটি হ'ল:

set arg1 arg2 ... argn

তবে আপনার প্রয়োজন:

set --

সেই তালিকাটি খালি করতে (বা shift "$#") এবং

set -- -foo

সেটে $1দিয়ে শুরু কিছু -বা +, তাই এটি একটি ভাল অভ্যাস সবসময় ব্যবহার করেন set --, বিশেষ করে যখন যেমন নির্বিচারে ডেটা ব্যবহার set -- "$@" other-argঅবস্থানগত প্যারামিটার তালিকার শেষে আর্গুমেন্ট যোগ করতে।

cshপরিবারের শেলগুলিতে ( csh, tcsh), আপনি argvঅ্যারে নিয়োগ করে :

set argv=(arg1 arg2)

এর শাঁস সালে rcপরিবারের সাথে ( rc, es, akanga), এর *অ্যারে:

*=(arg1 arg2)

যদিও আপনি স্বতন্ত্রভাবে উপাদানগুলি বরাদ্দ করতে পারেন:

2=arg2

ইন fish, অবস্থানগত পরামিতিগুলি কেবলargv অ্যারেতে থাকে (না , সেখানে):$1$@

set argv arg1 arg2

ইন zsh, সাথে সামঞ্জস্যের জন্য csh, আপনি argvঅ্যারেতেও নিয়োগ করতে পারেন :

argv=(arg1 arg2)
argv[4]=arg4

এবং আপনি এটি করতে পারেন:

5=arg5

এর অর্থ আপনি এই জাতীয় জিনিসগুলিও করতে পারেন:

argv+=(another-arg)

শেষ পর্যন্ত যুক্তি যুক্ত করতে এবং:

argv[-1]=()
argv[2]=()

শেষ বা মাঝ থেকে কোনও যুক্তি সরাতে, যা আপনি সহজেই অন্যান্য শাঁস দিয়ে করতে পারবেন না।


7
set --

আপনার যা প্রয়োজন:

$ set -- aaa bbb ccc
$ echo "$1"
aaa
$ echo "$2"
bbb
$ echo "$3"
ccc
$ echo "$@"
aaa bbb ccc
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.