मैं चाहता हूं कि मेरी स्क्रिप्ट एक वैकल्पिक इनपुट लेने में सक्षम हो,
उदाहरण के लिए वर्तमान में मेरी स्क्रिप्ट है
#!/bin/bash
somecommand foo
लेकिन मैं यह कहना चाहूंगा:
#!/bin/bash
somecommand [ if $1 exists, $1, else, foo ]
मैं चाहता हूं कि मेरी स्क्रिप्ट एक वैकल्पिक इनपुट लेने में सक्षम हो,
उदाहरण के लिए वर्तमान में मेरी स्क्रिप्ट है
#!/bin/bash
somecommand foo
लेकिन मैं यह कहना चाहूंगा:
#!/bin/bash
somecommand [ if $1 exists, $1, else, foo ]
जवाबों:
आप डिफ़ॉल्ट-मूल्य सिंटैक्स का उपयोग कर सकते हैं:
somecommand ${1:-foo}
उपरोक्त संदर्भ , जैसा कि बैश संदर्भ मैनुअल में वर्णित है - 3.5.3 शेल पैरामीटर विस्तार [जोर मेरा]:
यदि पैरामीटर अशांत या अशक्त है , तो शब्द का विस्तार प्रतिस्थापित किया जाता है। अन्यथा, पैरामीटर का मान प्रतिस्थापित किया जाता है।
यदि आप केवल डिफ़ॉल्ट मान को प्रतिस्थापित करना चाहते हैं यदि पैरामीटर अप्रभावित है (लेकिन यदि यह शून्य है, उदाहरण के लिए यदि यह खाली स्ट्रिंग नहीं है तो), इसके बजाय इस सिंटैक्स का उपयोग करें:
somecommand ${1-foo}
बैश संदर्भ मैनुअल से फिर से - 3.5.3 शेल पैरामीटर विस्तार :
केवल एक पैरामीटर के लिए एक परीक्षण में बृहदान्त्र परिणामों को स्वीकार करना जो परेशान है। एक और तरीका रखो, यदि बृहदान्त्र को शामिल किया गया है, ऑपरेटर पैरामीटर्स के अस्तित्व के लिए परीक्षण करता है और इसका मूल्य शून्य नहीं है; यदि बृहदान्त्र को छोड़ दिया जाता है, तो ऑपरेटर केवल अस्तित्व के लिए परीक्षण करता है।
foo
अगर $1
कोई परेशान है या एक खाली स्ट्रिंग है ", और ${1-foo}
, "वापसी foo
अगर $1
परेशान है"।
आप एक चर के लिए एक डिफ़ॉल्ट मान सेट कर सकते हैं जैसे:
#!/usr/bin/env bash
ARG1=${1:-foo}
ARG2=${2:-bar}
ARG3=${3:-1}
ARG4=${4:-$(date)}
echo "$ARG1"
echo "$ARG2"
echo "$ARG3"
echo "$ARG4"
यहाँ कुछ उदाहरण दिए गए हैं कि यह कैसे काम करता है:
$ ./somecommand.sh
foo
bar
1
Thu Mar 29 10:03:20 ADT 2018
$ ./somecommand.sh ez
ez
bar
1
Thu Mar 29 10:03:40 ADT 2018
$ ./somecommand.sh able was i
able
was
i
Thu Mar 29 10:03:54 ADT 2018
$ ./somecommand.sh "able was i"
able was i
bar
1
Thu Mar 29 10:04:01 ADT 2018
$ ./somecommand.sh "able was i" super
able was i
super
1
Thu Mar 29 10:04:10 ADT 2018
$ ./somecommand.sh "" "super duper"
foo
super duper
1
Thu Mar 29 10:05:04 ADT 2018
$ ./somecommand.sh "" "super duper" hi you
foo
super duper
hi
you
-
मुझे उलझन में (यह नकार दिया गया है?)।
if [ ! -z $1 ]
then
: # $1 was given
else
: # $1 was not given
fi
-n
के रूप में ही है ! -z
।
-n
और ! -z
इसलिए मैं कहूंगा कि यहां ऐसा नहीं है।
[ -n $1 ]
हमेशा सत्य रहेगा । यदि आप बैश का उपयोग [[ -n $1 ]]
करते हैं , तो आप अपेक्षा के अनुसार व्यवहार करेंगे, अन्यथा आपको उद्धृत करना होगा[ -n "$1" ]
कृपया मत भूलना, अगर इसके चर $ 1 .. $ n आपको प्रतिस्थापन का उपयोग करने के लिए एक नियमित चर को लिखने की आवश्यकता है
#!/bin/bash
NOW=$1
echo ${NOW:-$(date +"%Y-%m-%d")}
DAY=${1:-$(date +%F -d "yesterday")}
वैकल्पिक एकाधिक तर्कों के लिए, ls
कमांड के साथ सादृश्य द्वारा जो एक या एक से अधिक फाइलें ले सकता है या डिफ़ॉल्ट रूप से वर्तमान निर्देशिका में सब कुछ सूचीबद्ध कर सकता है:
if [ $# -ge 1 ]
then
files="$@"
else
files=*
fi
for f in $files
do
echo "found $f"
done
पथ में रिक्त स्थान के साथ फ़ाइलों के लिए सही ढंग से काम नहीं करता है, अफसोस। पता नहीं कैसे अभी तक वह काम करने के लिए है।
date
एक तर्क के लिए एक निश्चित मूल्य या एक कमांड (जैसे ) को प्रतिस्थापित करने के लिए चर प्रतिस्थापन का उपयोग करना संभव है । अब तक के जवाब निश्चित मूल्यों पर केंद्रित हैं, लेकिन यह वही है जो मैंने तारीख को एक वैकल्पिक तर्क बनाने के लिए इस्तेमाल किया था:
~$ sh co.sh
2017-01-05
~$ sh co.sh 2017-01-04
2017-01-04
~$ cat co.sh
DAY=${1:-$(date +%F -d "yesterday")}
echo $DAY