"चलो" आंतरिक शेल कमांड शेल स्क्रिप्ट में काम नहीं करता है? - खोल, यूनिक्स

मैंने किया

a=1234
let "a=a+1"

कमांड लाइन पर और यह ठीक है। लेकिन जब मैं एक शेल स्क्रिप्ट में ऐसा करता हूं। यह एक त्रुटि को प्रिंट करता है जो "चलो: नहीं मिला"। यहां स्क्रिप्ट फ़ाइल है।

#!/bin/sh
a=1234;
let "a=a+1";
echo "$a";

धन्यवाद,

उत्तर:

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

समस्या यह है कि /bin/sh आपके सामान्य खोल के समान नहीं है, या व्यवहार नहीं करता है। उदाहरण के लिए, कब bash के रूप में आह्वान किया जाता है /bin/sh, यह इसकी सामान्य विशेषताओं का सबसेट प्रदान करता है।

तो, आपको एक अलग खोल का उपयोग करने के लिए अपनी शेबांग लाइन को बदलने की आवश्यकता हो सकती है:

#!/bin/bash

या

#!/bin/ksh

आपको लाइनों के सिरों पर अर्ध-कॉलन की आवश्यकता नहीं है।


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

प्रयोग नहीं करें let। उपयोग पॉज़िक्स अंकगणितीय विस्तार: a=$(($a+1))। यह किसी भी POSIX- अनुरूप खोल में काम करने की गारंटी है।


जवाब के लिए 3 № 3

इस पर देखा: http://www.hlevkin.com/Shell_progr/hellobash.htm

सही है:

a=1234;
b=1;
a=`expr $a + $b`;

जवाब के लिए 2 № 4

आपको उपयोग करना चाहिए let a=a+1 बिना उद्धरण


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

यह "$ ए = 1234" का "$ ए" है जो आपको मार रहा है।

खोल सभी $ प्रतिस्थापन करता है और फिर अभिव्यक्ति का मूल्यांकन करता है। नतीजतन यह "= 1234" देखा क्योंकि $ ए के लिए कोई मूल्य नहीं था।

इसे देखने के लिए -x का उपयोग करें।

  bash -x आपकी-स्क्रिप्ट

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

कमांड लाइन में निम्न कमांड के साथ अपना वास्तविक खोल देखें:

$ SHELL गूंजें

यह एक शैल नाम प्रदान करेगा, जिसका उपयोग आपकी स्क्रिप्ट की पहली पंक्ति में / bin / sh के बजाय किया जाएगा।


उत्तर के लिए 0 № 7
  1. उपयोग कर खोल नाम की जांच करें

    echo $SHELL

  2. तदनुसार स्क्रिप्ट की पहली पंक्ति बदलें

    #!/bin/bash

    या

    #!/bin/ksh

    के बजाय #!/bin/sh


उत्तर के लिए -2 № 8
c=1
d=1
for i in `ls`
do
if [ -f $i ]
then
echo "$c -> $i"
c=`expr $c + 1`
fi
done
c=`expr $c - 1`
echo no. of files $c
for i in `ls`
do
if [ -d $i ]
then
echo "$d -> $i"
d=`expr $d + 1`
fi
done
d=`expr $d - 1`
echo no. of direcrories $d

संबंधित सवाल
सबसे लोकप्रिय