/ / बैश शेल स्क्रिप्ट में सभी तर्कों को प्रचारित करें - बैश, कमांड-लाइन-तर्क

प्रचार एक मार खोल स्क्रिप्ट में सभी तर्क-बैश, कमान लाइन-तर्क

मैं एक बहुत ही सरल स्क्रिप्ट लिख रहा हूं जो एक और स्क्रिप्ट को कॉल करता है, और मुझे अपनी वर्तमान स्क्रिप्ट से उस स्क्रिप्ट को निष्पादित करने की आवश्यकता है जो मैं निष्पादित कर रहा हूं।

उदाहरण के लिए, मेरी स्क्रिप्ट का नाम है foo.sh और कॉल bar.sh

foo.sh:

bar $1 $2 $3 $4

प्रत्येक पैरामीटर को स्पष्ट रूप से निर्दिष्ट किए बिना मैं यह कैसे कर सकता हूं?

उत्तर:

उत्तर № 1 के लिए 952

उपयोग "$@" सादे के बजाय $@ यदि आप वास्तव में चाहते हैं कि आपके पैरामीटर समान हों।

का निरीक्षण करें:

$ cat foo.sh
#!/bin/bash
baz.sh $@

$ cat bar.sh
#!/bin/bash
baz.sh "$@"

$ cat baz.sh
#!/bin/bash
echo Received: $1
echo Received: $2
echo Received: $3
echo Received: $4

$ ./foo.sh first second
Received: first
Received: second
Received:
Received:

$ ./foo.sh "one quoted arg"
Received: one
Received: quoted
Received: arg
Received:

$ ./bar.sh first second
Received: first
Received: second
Received:
Received:

$ ./bar.sh "one quoted arg"
Received: one quoted arg
Received:
Received:
Received:

उत्तर। 2 के लिए 453

के लिये दे घुमा के और अन्य बॉर्न-जैसे गोले:

java com.myserver.Program "$@"

उत्तर № 3 के लिए 72

उपयोग "$@" (सभी के लिए काम करता है POSIX हमवतन)।

[...], बैश में "$ @" वैरिएबल होता है, जो स्पेस द्वारा अलग किए गए सभी कमांड-लाइन मापदंडों का विस्तार करता है।

से मिसाल के तौर पर बैश.


जवाब के लिए 24 № 4
#!/usr/bin/env bash
while [ "$1" != "" ]; do
echo "Received: ${1}" && shift;
done;

बस सोचा कि यह थोड़ा अधिक उपयोगी हो सकता है जब यह जांचने की कोशिश की जाए कि आपकी स्क्रिप्ट में कैसे आर्गन आते हैं


12 के लिए उत्तर № 5

मुझे लगता है कि यह अच्छी तरह से उत्तर दिया गया है, लेकिन यहाँ "$ @" $ @ "$ *" और $ * के बीच एक तुलना है

परीक्षण स्क्रिप्ट की सामग्री:

# cat ./test.sh
#!/usr/bin/env bash
echo "================================="

echo "Quoted DOLLAR-AT"
for ARG in "$@"; do
echo $ARG
done

echo "================================="

echo "NOT Quoted DOLLAR-AT"
for ARG in $@; do
echo $ARG
done

echo "================================="

echo "Quoted DOLLAR-STAR"
for ARG in "$*"; do
echo $ARG
done

echo "================================="

echo "NOT Quoted DOLLAR-STAR"
for ARG in $*; do
echo $ARG
done

echo "================================="

अब, विभिन्न तर्कों के साथ परीक्षण स्क्रिप्ट चलाएँ:

# ./test.sh  "arg with space one" "arg2" arg3
=================================
Quoted DOLLAR-AT
arg with space one
arg2
arg3
=================================
NOT Quoted DOLLAR-AT
arg
with
space
one
arg2
arg3
=================================
Quoted DOLLAR-STAR
arg with space one arg2 arg3
=================================
NOT Quoted DOLLAR-STAR
arg
with
space
one
arg2
arg3
=================================

जवाब के लिए 5 № 6

मेरी SUN यूनिक्स की बहुत सी सीमाएँ हैं, यहां तक ​​कि "$ @" को भी वांछित नहीं समझा गया था। मेरा समाधान $ {@} है। उदाहरण के लिए,

#!/bin/ksh
find ./ -type f | xargs grep "${@}"

वैसे, मेरे पास यह विशेष स्क्रिप्ट होनी थी क्योंकि मेरा यूनिक्स भी grep -r का समर्थन नहीं करता है


उत्तर के लिए 1 № 7

ठीक काम करता है, सिवाय इसके कि आपके पास स्थान हैं या वर्ण बच गए हैं। मैं इस मामले में तर्कों को पकड़ने और स्क्रिप्ट के अंदर एक ssh को भेजने का तरीका नहीं ढूंढता।

यह उपयोगी हो सकता है लेकिन इतना बदसूरत है

_command_opts=$( echo "$@" | awk -F- "BEGIN { OFS=" -" } { for (i=2;i<=NF;i++) { gsub(/^[a-z] /,"&@",$i) ; gsub(/ $/,"",$i );gsub (/$/,"@",$i) }; print $0 }" | tr "@" " )

जवाब के लिए 0 № 8

यदि आप शामिल हैं $@ अन्य वर्णों के साथ एक उद्धृत स्ट्रिंग में, कई तर्क होने पर व्यवहार बहुत अजीब होता है, केवल पहला तर्क उद्धरण के अंदर शामिल होता है।

उदाहरण:

#!/bin/bash
set -x
bash -c "true foo $@"

पैदावार:

$ bash test.sh bar baz
+ bash -c "true foo bar" baz

लेकिन पहले एक अलग चर को असाइन करना:

#!/bin/bash
set -x
args="$@"
bash -c "true foo $args"

पैदावार:

$ bash test.sh bar baz
+ args="bar baz"
+ bash -c "true foo bar baz"