我不知道我的Shell脚本是否正确

时间:2019-05-15 10:05:24

标签: bash if-statement

我有一个使用for循环的作业,但是我不太了解我必须在其中执行的任务。我写了一个脚本,但我觉得这不是正确的脚本。请帮忙!

这是问题:

编写一个shell脚本以列出任何目录的内容,并为每个文件(包括不可见的文件)指示该文件是目录,纯文件,还是公共的和/或可执行的,这个过程

#!/bin/bash

if [ $# -lt 1 ] ; then
echo " file doesn't exist"
echo 
echo " variable needed to run a command"
fi
echo ---------------------------------------------
echo ---------------------------------------------

for i in $*
do
if [ -f $i ]; then 
echo " it's a file";
echo "THIS IS A LIST OF FILE and DIRECTORY in $i"
ls -a $i
fi
done
echo -----------------------------------------
if [ -d $i ]; then

echo "directory" ;
echo "THIS IS A LIST OF FILES AND DIRETORY in $i"

ls -a $i
fi
echo ------------------------------------------
if [ -x $i ]; then
echo "executable"
echo "THIS IS A LIST OF EXECUTABLE FILE IN $i" 
ls -x $i
fi
echo -----------------------------------------
if [ -r $i ]; then
echo "this file is a public file"
else "this is a private file" 
fi
#!/bin/bash

if [ $# -lt 1 ] ; then
echo " file doesn't exist"
echo 
echo " variable needed to run a command"
fi
echo ---------------------------------------------
echo ---------------------------------------------

for i in $*
do
if [ -f $i ]; then 
echo " it's a file";
echo "THIS IS A LIST OF FILE and DIRECTORY in $i"
ls -a $i
fi
done
echo -----------------------------------------
if [ -d $i ]; then

echo "directory" ;
echo "THIS IS A LIST OF FILES AND DIRETORY in $i"

ls -a $i
fi
echo ------------------------------------------
if [ -x $i ]; then
echo "executable"
echo "THIS IS A LIST OF EXECUTABLE FILE IN $i" 
ls -x $i
fi
echo -----------------------------------------
if [ -r $i ]; then
echo "this file is a public file"
else "this is a private file" 
fi

1 个答案:

答案 0 :(得分:1)

写得不好的规范是教育的祸根。 “公共”在这里听起来像是错误的单词。我认为它的意思是“可读”。

您检查是否有参数,但如果没有则不退出程序。我还要确认它是一个目录,并且可读。

The manual将为您带来很多好处。在学习这些东西之前,请多做一些阅读,然后再做大量引用以确保。

Read this section carefully,为自己创建一些测试以证明它们有效并且您理解它们,并且您的工作将完成一半以上。

请勿使用[。通常,最好改用[[,除非您使用((case或其他构造。

我看不到for循环是指定的,但是应该没问题。请注意,您可能必须分别指定$1/*$1/.*

尽管如此,将所有测试放在一个循环中。对于每个文件,测试它是否是目录-如果存在,请报告它。测试它是否是纯文件-如果是,则报告它。

我不喜欢为某人做家庭作业,但是看起来您可以使用简化此过程的示例。我建议您不要以书面形式使用它-对其进行分解并使其更清楚,但这是常规逻辑的模板。

#! /bin/env bash

(( $# )) && [[ -d "$1" ]] && [[ -r "$1" ]] || {
    echo "use: $0 <dir>" >&2
    exit 1
}

for e in "$1"/.* "$1"/*
do  echo "$e:"
    [[ -d "$e" ]] && echo " is a directory"
    [[ -f "$e" ]] && echo " is a plain file"
    [[ -r "$e" ]] && echo " is readable"
    [[ -x "$e" ]] && echo " is executable"
done

如果您阅读了我提供的链接,则应该能够理解并理解它。

通常,您的脚本很长,而且有些混乱。更简单更易于理解和维护。例如,对于块缩进要非常小心,以了解范围。

$: for i in 1 2 3
> do echo $i
> done
1
2
3
$: echo $i
3

将此与-

进行比较
for i in $*
do  if [ -f $i ]; then 
       echo " it's a file";
       echo "THIS IS A LIST OF FILE and DIRECTORY in $i"
       ls -a $i
    fi
done
echo -----------------------------------------
if [ -d $i ]; then 
   echo "directory" ;
   echo "THIS IS A LIST OF FILES AND DIRETORY in $i"
   ls -a $i
fi

您正在测试每个条目是否是文件,如果是,则每次报告"THIS IS A LIST OF FILE and DIRECTORY in $i" ...

,但是仅测试 last 一个目录,看它是否是目录,因为[ -d $i ]done之后。

...您是否在某个地方运行过该软件以进行尝试,并查看结果?