पहली स्पष्ट बात यह है कि आपको तर्क के बीच रिक्त स्थान प्रदान करना चाहिए [
, test
या [[
:
if [ "$1" = 1 ];
जब बैश में, का उपयोग करने [[ ]]
की सिफारिश की जाती है क्योंकि यह सशर्त अभिव्यक्ति के लिए अनावश्यक चीजों को नहीं करता है जैसे शब्द विभाजन और pathname विस्तार। दोहरे उद्धरण चिह्नों के आसपास भी उद्धृत करने की आवश्यकता नहीं है। अधिक पठनीय ऑपरेटर ==
का भी उपयोग किया जा सकता है।
if [[ $1 == 1 ]];
जोड़ा ध्यान दें: दूसरे संकार्य भी चर होते हैं, के हवाले से आवश्यक है के रूप में यह पैटर्न मिलान के अधीन हो सकता है, तो ऐसा लगता है कि पहचानने योग्य वर्ण हैं *
, ?
, []
, आदि .. तो ग्लोबिंग बढ़ाया या पैटर्न मिलान के साथ सक्षम किया गया है shopt -s extglob
, अन्य रूपों की तरह @()
, !()
आदि पैटर्न के रूप में भी पहचाना जाएगा। पैटर्न मिलान देखें ।
जैसे ऑपरेटरों के साथ <
और >
यह अभी भी आवश्यक हो सकता है क्योंकि मैंने एक बार एक बग का सामना किया था जहां दूसरे तर्क को उद्धृत नहीं करने के कारण अलग-अलग परिणाम हुए।
पहले ऑपरेंड के लिए, कुछ भी लागू नहीं होता है।
इस सरल भिन्नता पर भी विचार करें:
case "$1" in
1)
mv -- "${@:2}" ~/lab/Sun
;;
2)
mv -- "${@:2}" ~/lab/Moon
;;
3)
mv -- "${@:2}" ~/lab/Earth
;;
esac
या संघनित:
case "$1" in
1) mv -- "${@:2}" ~/lab/Sun ;;
2) mv -- "${@:2}" ~/lab/Moon ;;
3) mv -- "${@:2}" ~/lab/Earth ;;
esac
"${@:2}"
विकल्प का एक रूप है विस्तार या सरणी सदस्य विस्तार जहां 2
ऑफसेट है। यह दूसरे मूल्य पर विस्तार शुरू करता है। इसके साथ हमें उपयोग करने की आवश्यकता नहीं हो सकती है shift
।
जोड़ा अमान्य विकल्पों के रूप में डैश ( ) से शुरू होने वाले फ़ाइलनाम को पहचानने से --
रोकता mv
है -
।
$var
,$(cmd)
और यहां तक कि`cmd`
[जो करने के लिए$(cmd)
प्राथमिकता दी जानी चाहिए])। कुछ किनारे मामले हैं जहां आपको उद्धृत करने की आवश्यकता नहीं है , लेकिन हमेशा ऐसा करने से चोट नहीं पहुंचेगी।