我有一个使用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
答案 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
之后。
...您是否在某个地方运行过该软件以进行尝试,并查看结果?