我正在编写一个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
有人可以试着指出我正确的方向吗?谢谢!
答案 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" ]