2011-06-20 52 views
7

我做「讓」內部shell命令不能在shell腳本中工作?

a=1234 
let "a=a+1" 

在命令行和它的罰款。但是當我在shell腳本中做同樣的事情時。它打印出一個「let:not found」的錯誤。 這是腳本文件。

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

感謝,

+3

您可能正在使用不同的shell - 在腳本開始時是否有shebang行? –

+1

也許使用'a = 1234'?選中這個:'help | grep let'。 – marioosh

+0

'echo $ SHELL' - 它說什麼? – marioosh

回答

7

的問題很可能是/bin/sh是不一樣的,或不行爲一樣,正常的外殼。例如,當bash被調用爲/bin/sh時,它提供了其正常功能的子集。

所以,你可能需要改變你的家當線使用不同的外殼:

#!/bin/bash 

#!/bin/ksh 

你不需要分號在線路的兩端。

1

它的是殺了你 '$ a = 1234' 的 '$ A'。

shell執行所有$替換,然後評估表達式。因此它看到「= 1234」,因爲沒有價值$ a。

使用-x來看看這個。

 bash -x your-script
+0

對不起,我其實沒有使用$修正我的問題。 – John

0

在命令行下面的命令來檢查你的實際外殼:

回聲$ SHELL

它將提供一個shell的名字,就用它來的/ bin/sh的在第一線你的腳本。

+1

是的問題是與shebang。我將它改爲#!/ bin/bash(echo $ SHELL打印bash)並且它可以工作。但是,shebang的目的是什麼?我認爲它調用適當的shell來執行腳本。 (我已經在/斌)。還是在bourne shell中不支持let? – John

2

您應該使用let a=a+1不帶引號

8

不要使用let。使用POSIX arithmetic expansiona=$(($a+1))。這保證可以在任何符合POSIX標準的shell中工作。

+0

這是最好的解決方案 – daniel

-2
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 
+0

歡迎來到Stack Overflow!雖然這段代碼可能有助於解決這個問題,但它並沒有解釋_why_和/或_how_它是如何回答這個問題的。提供這種附加背景將顯着提高其長期教育價值。請[編輯]您的答案以添加解釋,包括適用的限制和假設。 –

0
  1. 使用

    echo $SHELL

  2. 更改腳本的第一線檢查外殼名稱相應地

    #!/bin/bash

    #!/bin/ksh

    ,而不是#!/bin/sh