shell脚本仅在某些目录中按需运行

时间:2014-07-29 05:09:55

标签: shell unix sh

我正在编写一个bourne shell脚本,它基本上具有与ls相同的功能。

这是我的代码。

#!/bin/sh

echo "\n"                               

if [ "$#" -eq 0 ]
then
    SEARCH_DIR=`pwd`
fi

if [ "$#" -gt 0 ]
then
    SEARCH_DIR=$1
    if [ ! -d "$SEARCH_DIR" ]
    then
        echo "Directory Does Not Exist - - - Exiting"
        echo "\n"
        exit
    fi
fi

DIR_CONTENT=`ls $SEARCH_DIR`    

for file in $DIR_CONTENT
do
    if [ -f "$file" ]         
    then
    echo "f\c"
    fi

    if [ -d "$file" ]         
    then
        echo "d\c"
    fi

    if [ ! -f "$file" ] && [ ! -d "$file" ] 
    then
        echo "-\c"
    fi

    if [ -r "$file" ]         
    then
        echo "r\c"
    else                
        echo "-\c"
    fi

    if [ -w "$file" ]         
    then
        echo "w\c"
    else                
        echo "-\c"
    fi

    if [ -x "$file" ]    
    then
        echo "x\c"
    else                
        echo "-\c"
    fi

    echo ' \c'              
    echo "$file"              


done
    echo "\n"

当我执行脚本时,我得到该特定目录的所需输出: 例如:

$ ./dirinfo


dirinfo version 0.1


drwx Desktop
frwx dirinfo
frw- #dirinfo#
frwx dirinfo~
frwx dirinfo2~

但是如果我尝试为不同的目录传递一个参数,那么脚本似乎不会确认我的if语句。

例如:

$ ./dirinfo /bin


dirinfo version 0.1


---- bash
---- bunzip2
---- busybox
---- bzcat
---- bzcmp

但是如果我从/ bin目录执行脚本,我会得到所需的效果:

$ cd /bin    
$ ~/dirinfo


dirinfo version 0.1


fr-x bash
fr-x bunzip2
fr-x busybox
fr-x bzcat
fr-x bzcmp

有人可以试着指出我正确的方向吗?谢谢!

3 个答案:

答案 0 :(得分:1)

现在没有bash可以测试,但是$ file可能没有完整路径,所以评估-r或-w是行不通的。当您cd到目标目录时,文件已打开./。

答案 1 :(得分:0)

是的,因为user430051提到你是从一个目录运行它并列出另一个无法工作的文件。

解决方案是在文件名之前搜索dir,

for file in $DIR_CONTENT
do
    file="$SEARCH_DIR/$file"
    if [ -f "$file" ]         
    then
    echo "f\c"
    fi

它应该有用。

答案 2 :(得分:0)

可以通过多种方式解决您的问题,但最简单的解决方案是添加一行缺失的行(即cd“$ SEARCH_DIR”),只需在DIR_CONTENT = ls $SEARCH_DIR之后将其添加到脚本中即可脚本很适合你的期望。

Nachiket给出的这个解决方案和上面的主要区别在于,在我的解决方案中,输出中的文件名不会有绝对路径,我猜是你的期望。

DIR_CONTENT=`ls $SEARCH_DIR`    

cd "$SEARCH_DIR"

for file in $DIR_CONTENT
do
    if [ -f "$file" ]