বাশ স্ক্রিপ্ট - চলমান কমান্ড হিসাবে পরিবর্তনশীল সামগ্রী


159

আমার কাছে পার্ল স্ক্রিপ্ট রয়েছে যা আমাকে একটি সংজ্ঞায়িত তালিকা এলোমেলো নম্বর দেয় যা কোনও ফাইলের লাইনের সাথে মিলে যায়। এরপরে আমি ফাইলটি ব্যবহার করে সেই লাইনগুলি বের করতে চাই sed

#!/bin/bash
count=$(cat last_queries.txt | wc -l)
var=$(perl test.pl test2 $count)

ভেরিয়েবল varএকটি আউটপুট যেমন: প্রদান করে cat last_queries.txt | sed -n '12p;500p;700p'। সমস্যাটি হ'ল আমি এই শেষ আদেশটি চালাতে পারছি না। আমি চেষ্টা করেছিলাম $var, তবে আউটপুট সঠিক নয় (যদি আমি ম্যানুয়ালি কমান্ডটি চালিত করি তবে এটি কার্যকর হয়, সুতরাং কোনও সমস্যা নেই)। এটি করার সঠিক উপায় কী?

পিএস: অবশ্যই আমি পার্লের সমস্ত কাজ করতে পারতাম, তবে আমি এইভাবে শেখার চেষ্টা করছি, কারণ এটি অন্যান্য পরিস্থিতিতে আমাকে সহায়তা করতে পারে।

উত্তর:


215

আপনার কেবল এটি করা দরকার:

#!/bin/bash
count=$(cat last_queries.txt | wc -l)
$(perl test.pl test2 $count)

তবে, আপনি যদি আপনার পার্ল কমান্ডটি পরে কল করতে চান এবং সে কারণেই আপনি এটিকে কোনও ভেরিয়েবলের কাছে বরাদ্দ করতে চান তবে:

#!/bin/bash
count=$(cat last_queries.txt | wc -l)
var="perl test.pl test2 $count" # You need double quotes to get your $count value substituted.

...stuff...

eval $var

বাশের সহায়তা অনুসারে:

~$ help eval
eval: eval [arg ...]
    Execute arguments as a shell command.

    Combine ARGs into a single string, use the result as input to the shell,
    and execute the resulting commands.

    Exit Status:
    Returns exit status of command or success if command is null.


2
line=$((${RANDOM} % $(wc -l < /etc/passwd)))
sed -n "${line}p" /etc/passwd

পরিবর্তে আপনার ফাইল দিয়ে।

এই উদাহরণে আমি ফাইল / ইত্যাদি / পাসওয়ার্ডটি বিশেষ ভেরিয়েবল ব্যবহার করে ${RANDOM}(যার বিষয়ে আমি এখানে শিখেছি) ব্যবহার করেছি এবং sedআপনার যে অভিব্যক্তিটি ছিল, কেবল তারতম্যটি হ'ল আমি ভেরিয়েবলটি প্রসারিত করার জন্য এককটির পরিবর্তে ডাবল কোট ব্যবহার করছি।


2

আপনি যে কমান্ডটি চালাচ্ছেন তার জন্য যুক্তিযুক্ত যুক্ত একাধিক ভেরিয়েবল রয়েছে এবং কেবল একটি স্ট্রিংই নয় , আপনার সরাসরি ক্রম ব্যবহার করা উচিত নয় , কারণ এটি নিম্নলিখিত ক্ষেত্রে ব্যর্থ হবে:

function echo_arguments() {
  echo "Argument 1: $1"
  echo "Argument 2: $2"
  echo "Argument 3: $3"
  echo "Argument 4: $4"
}

# Note we are passing 3 arguments to `echo_arguments`, not 4
eval echo_arguments arg1 arg2 "Some arg"

ফলাফল:

Argument 1: arg1
Argument 2: arg2
Argument 3: Some
Argument 4: arg

মনে রাখবেন যে "কিছু যুক্তি" একক যুক্তি হিসাবে পাস হলেও evalএটি দুটি হিসাবে পড়ুন।

পরিবর্তে, আপনি কেবল কমান্ড হিসাবে স্ট্রিংটি ব্যবহার করতে পারেন:

# The regular bash eval works by jamming all its arguments into a string then
# evaluating the string. This function treats its arguments as individual
# arguments to be passed to the command being run.
function eval_command() {
  "$@";
}

আউটপুট evalএবং নতুন eval_commandফাংশনের মধ্যে পার্থক্যটি নোট করুন :

eval_command echo_arguments arg1 arg2 "Some arg"

ফলাফল:

Argument 1: arg1
Argument 2: arg2
Argument 3: Some arg
Argument 4:

1
Eval সঙ্গে আপনার প্রথম উদাহরণ হিসাবে স্থান পর প্রতিটি উপাদান মূল্যায়ন এড়াতে, একক উদ্ধৃতি দিয়ে মোড়ানো: eval 'echo_arguments arg1 arg2 "Some arg"'। তারপরে আউটপুটটি আপনার দ্বিতীয় উদাহরণের মতো হবে।
নোয়াম মানস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.