मान लीजिए कि मैं main.sh में है:
$NAME="a string"
if [ -f $HOME/install.sh ]
. $HOME/install.sh $NAME
fi
और install.sh में:
echo $1
यह गूंज माना जाता है "a string"
, लेकिन यह कुछ भी नहीं करता है। क्यों?
मान लीजिए कि मैं main.sh में है:
$NAME="a string"
if [ -f $HOME/install.sh ]
. $HOME/install.sh $NAME
fi
और install.sh में:
echo $1
यह गूंज माना जाता है "a string"
, लेकिन यह कुछ भी नहीं करता है। क्यों?
जवाबों:
माइकल Mrozek ज्यादातर मुद्दों को शामिल किया गया है और उनके सुधार काम करेंगे क्योंकि आप बैश का उपयोग कर रहे हैं।
आपको इस तथ्य में दिलचस्पी हो सकती है कि तर्कों के साथ एक स्क्रिप्ट को स्रोत करने की क्षमता एक बशीवाद है। में sh
या dash
आपकी main.sh
कुछ भी गूंज नहीं होगी क्योंकि खट्टी स्क्रिप्ट के तर्कों को नजरअंदाज कर दिया जाता है और $1
वह तर्क को संदर्भित करेगाmain.sh.
जब आप स्क्रिप्ट का स्रोत sh
बनाते हैं, तो ऐसा लगता है जैसे आपने अभी-अभी उस फ़ाइल में जिस फ़ाइल से इसे सॉर किया गया था, उसमें मौजूद स्क्रिप्ट के टेक्स्ट को कॉपी और पेस्ट किया है। निम्नलिखित पर ध्यान दें (ध्यान दें, मैंने सुधार माइकल की सिफारिश की है):
$ bash ./test.sh
A String
$ sh ./test.sh
$ sh ./test.sh "HELLO WORLD"
HELLO WORLD
मुझे तीन त्रुटियाँ दिखाई देती हैं:
आपकी असाइनमेंट लाइन गलत है:
$NAME="a string"
जब आप किसी वैरिएबल को असाइन करते हैं तो आप इसमें शामिल नहीं होते हैं $
; यह होना चाहिए:
NAME="a string"
तुम चूक रहे हो then
; सशर्त रेखा होनी चाहिए:
if [ -f $HOME/install.sh ]; then
आप $NAME
रिक्त स्थान होने के बावजूद उद्धृत नहीं कर रहे हैं । स्रोत पंक्ति होनी चाहिए:
. $HOME/install.sh "$NAME"
[ -f $HOME/install.sh ] && . $HOME/install.sh $NAME
; मैं शायद तरह बातें नहीं करना चाहिए कि जब मैं त्रुटियों के लिए देख रहा हूँ
बस स्क्रिप्ट सोर्सिंग से पहले अपने पैरामीटर्स सेट करें!
#!/bin/bash
NAME=${*:-"a string"}
if [[ -f install.sh ]];
then
set -- $NAME ;
. install.sh ;
fi
exit;
#!/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}"