2014-12-04 104 views
0

我正在爲一個類構建一個bourne腳本,並且遇到此循環的問題。基本上,我構建了一個循環遍歷指定目錄中的所有文件,並確定有多少文件和目錄以及多少文件可讀,可寫和/或可執行。問題是,當我運行該腳本,它返回以下錯誤:在bourne腳本中出現「expr:command not found」錯誤

assignment4.sh: line 61: expr: command not found 
assignment4.sh: line 61: expr: command not found 
assignment4.sh: line 36: expr: command not found 
assignment4.sh: line 41: expr: command not found 
assignment4.sh: line 48: expr: command not found 
assignment4.sh: line 55: expr: command not found 
assignment4.sh: line 36: expr: command not found 
assignment4.sh: line 41: expr: command not found 
assignment4.sh: line 48: expr: command not found 
assignment4.sh: line 36: expr: command not found 
assignment4.sh: line 41: expr: command not found 
assignment4.sh: line 48: expr: command not found 

的代碼導致此錯誤的部分如下:

for filename in "$PATH"/"$1"/* 
do 
    if [ -f "$filename" ] 
    then 
     files=`expr $files + 1` 

     if [ -r "$filename" ] 
     then 
     readable=`expr $readable + 1` 
     fi 

     if [ -w "$filename" ] 
     then  
      writeable=`expr $writeable + 1` 
     fi 

     if [ -x "$filename" ] 
     then 
      executable=`expr $executable + 1` 
     fi 
    elif [ -d "$filename" ] 
    then 
     directories=`expr $directories + 1` 
    fi 
done 

我知道expr是機器我上m跑,因爲我之前用它和它的工作,雖然我也不得不改變它利用我的發言的格式之前對其進行格式化

var=`expr $var+1` 

,並沒有更新的雜物ble的價值是正確的方式。

+0

你改變了你的'$ PATH'嗎? 'type -a expr'打印什麼? – 2014-12-04 01:14:22

+0

Bourne,還是POSIX sh?中等規模的Solaris是唯一遠程操作系統,其中'/ bin/sh'仍然是POSIX Bourne之前的版本;破折號,灰燼,busybox sh等都符合POSIX標準(標準本身大部分來自ksh),而不是Bourne。 – 2014-12-04 01:19:13

+3

從代碼看起來您​​選擇PATH作爲變量名稱,並且意外地覆蓋了shell搜索路徑。 – 2014-12-04 01:25:05

回答

2

腳本運行時的$ PATH是什麼? expr總是存在的(傳統上在/ bin中,但是在linux上的/ usr/bin中)

但是你不能迭代$ PATH/$ 1/*,因爲PATH就像/bin:/usr/bin:/usr/local/bin,它不匹配任何目錄。我想你想for filename in $(echo -n $PATH | tr : ' ')/$1/*或一些這樣的

+0

我確實改變了$ PATH值,因爲它沒有把我的CWD。我認爲相反,我會在''pwd \'/ $ 1/*'中使用'作爲文件名',因爲我不確定你的代碼中的'tr:'''部分是幹什麼的,我的課程並不特別-深度。 – 2014-12-04 01:23:57

+0

@Neomang,使用'「$ PWD/$ 1 /」*'代替。如果你不引用'$ 1',它會得到字符串分割,所以'$ 1'中任何帶空格的文件名都不會正確運行。 – 2014-12-04 01:27:14

+0

你的問題是你覆蓋了'PATH'的值,這是shell用來查找'expr'等可執行文件的值。爲了您自己的目的,不要使用'PATH'(或其他所有大寫變量名稱)。 – chepner 2014-12-04 04:03:45

0

如果這不是伯恩但POSIX SH(也就是在90年代初,從上世紀70年代,而不是一個直接的行爲規範兼容的外殼),你可以使用:

readable=$((readable + 1)) 

...而不是依靠expr

相關問題