बैश स्क्रिप्ट - चर सामग्री को चलाने के लिए एक कमांड के रूप में


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

उस स्थिति में जहां आपके पास कई चर हैं, जिसमें आप एक कमांड के लिए तर्क दे रहे हैं, और केवल एक स्ट्रिंग नहीं है, आपको सीधे eval का उपयोग नहीं करना चाहिए , क्योंकि यह निम्नलिखित मामले में विफल होगा:

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"':। तब आउटपुट आपके दूसरे उदाहरण में होगा।
नोआम मानोस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.