जब यह सोर्सिंग एक बैश स्क्रिप्ट के लिए चर पासिंग


18

मान लीजिए कि मैं main.sh में है:

$NAME="a string"
if [ -f $HOME/install.sh ]
    . $HOME/install.sh $NAME
fi

और install.sh में:

echo $1

यह गूंज माना जाता है "a string", लेकिन यह कुछ भी नहीं करता है। क्यों?


2
कृपया सवाल अपडेट न करें। इस तरह हम यह नहीं देख सकते कि आपके प्रारंभिक प्रश्न में क्या गलत था। मैंने उसे वापस घुमाया।
वैलेंटाइन बजरमी

जवाबों:


20

माइकल Mrozek ज्यादातर मुद्दों को शामिल किया गया है और उनके सुधार काम करेंगे क्योंकि आप बैश का उपयोग कर रहे हैं।

आपको इस तथ्य में दिलचस्पी हो सकती है कि तर्कों के साथ एक स्क्रिप्ट को स्रोत करने की क्षमता एक बशीवाद है। में shया dashआपकी main.shकुछ भी गूंज नहीं होगी क्योंकि खट्टी स्क्रिप्ट के तर्कों को नजरअंदाज कर दिया जाता है और $1वह तर्क को संदर्भित करेगाmain.sh.

जब आप स्क्रिप्ट का स्रोत shबनाते हैं, तो ऐसा लगता है जैसे आपने अभी-अभी उस फ़ाइल में जिस फ़ाइल से इसे सॉर किया गया था, उसमें मौजूद स्क्रिप्ट के टेक्स्ट को कॉपी और पेस्ट किया है। निम्नलिखित पर ध्यान दें (ध्यान दें, मैंने सुधार माइकल की सिफारिश की है):

$ bash ./test.sh
A String
$ sh ./test.sh

$ sh ./test.sh "HELLO WORLD"
HELLO WORLD

"Sh या डैश में आपका main.sh कुछ भी गूँज नहीं पाएगा क्योंकि खट्टी स्क्रिप्ट की दलीलों को नज़रअंदाज़ कर दिया जाता है और $ 1 मुख्य तर्क को संदर्भित करेगा।" ठीक यही बात है। जवाब के लिए धन्यवाद।
कोई अभी भी आप

मैंने आपको उत्तर के रूप में स्वीकार किए जाने के रूप में चिह्नित किया है, क्योंकि वास्तविक मुद्दा मेरी स्क्रिप्ट में त्रुटियों के साथ नहीं था, लेकिन मुख्य रूप से इसलिए कि मैंने बैश के साथ श को समान किया है, और बैश इस स्थिति में श के अनुकरण का एक खराब काम करता है। आपके उत्तर ने मुझे इस मुद्दे के बारे में बताया, धन्यवाद;
कोई अभी भी आपको

2
तकनीकी रूप से, यह यहाँ अधिक kshism है (पहले से ही ksh86 में, संभवतः पहले)। @ SomebodystillusesyouMS-DOS, "sh" विनिर्देश यह नहीं कहता है कि यदि आप अतिरिक्त तर्क पास करते हैं तो क्या होना चाहिए, इसलिए डैश या बैश व्यवहार अन्य की तुलना में अधिक "श" नहीं हैं और समान रूप से मान्य हैं।
स्टीफन चेज़लस

16

मुझे तीन त्रुटियाँ दिखाई देती हैं:

  1. आपकी असाइनमेंट लाइन गलत है:

    $NAME="a string"

    जब आप किसी वैरिएबल को असाइन करते हैं तो आप इसमें शामिल नहीं होते हैं $; यह होना चाहिए:

    NAME="a string"
  2. तुम चूक रहे हो then; सशर्त रेखा होनी चाहिए:

    if [ -f $HOME/install.sh ]; then
  3. आप $NAMEरिक्त स्थान होने के बावजूद उद्धृत नहीं कर रहे हैं । स्रोत पंक्ति होनी चाहिए:

    . $HOME/install.sh "$NAME"

उसके पास कुछ अन्य त्रुटियां भी हैं, लेकिन मुझे नहीं लगता कि जरूरी मुद्दे का स्रोत वह है।
स्टीवन डी

@ सही आप सही हैं, कुछ और भी थे जिनका मैंने उल्लेख नहीं किया था; यह ठीक करता है मैं अब सूचीबद्ध किया है साथ मेरे लिए काम करता
माइकल Mrozek

@ जब मैं स्क्रिप्ट को एक साथ फेंक रहा था, तो मैंने इसे संक्षिप्त करने की कोशिश की [ -f $HOME/install.sh ] && . $HOME/install.sh $NAME; मैं शायद तरह बातें नहीं करना चाहिए कि जब मैं त्रुटियों के लिए देख रहा हूँ
माइकल Mrozek

ऐसा लगता है कि दूसरी समस्या मुझे लगा कि वास्तव में कोई समस्या नहीं है क्योंकि वह विशेष रूप से BASH का उल्लेख करती है।
स्टीवन डी

5

बस स्क्रिप्ट सोर्सिंग से पहले अपने पैरामीटर्स सेट करें!

main.sh

#!/bin/bash
NAME=${*:-"a string"}
if [[ -f install.sh ]];
then
    set -- $NAME ;
    . install.sh ;
fi
exit;

install.sh

#!/bin/bash
echo  " i am sourced by [ ${0##*/} ]";
echo  " with [ $@ ] as parametr(s) ";
exit;

परीक्षा

u@h$ ./main.sh some args
 i am sourced by [ main.sh ]
 with [ some args ] as parametr(s) 
u@h$

आप झंडे कैसे सेट करते हैं?
जोनाथन लैंड्रम

संपादित करें: आप जाहिरा तौर पर बस उन्हें स्ट्रिंग करते हैं --जैसे वे कमांड तर्क थे:set -- -v foo -l bar -j "${bin}"
जोनाथन लैंड्रम
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.