Shell识别文件〜但不在〜/ Documents中

Ale*_*key 5 linux bash shell

我正在上Unix课程,这是我的任务的一部分:

对于用户的〜/ Documents目录中的每个文件和子目录,确定该项是文件还是目录,并使用语句中的文件名显示相应的消息.

那么,我写的是这样的:

docs=`ls ~/Documents`

for file in $docs ; do
    if [ -f $file ] ; then
        echo $file "is a file."
    elif [ -d $file ] ; then
        echo $file "is a directory."
    else
        echo $file "is not a file or directory."
    fi
done
Run Code Online (Sandbox Code Playgroud)

我的文档目录包括以下文件和目录:

DocList.txt  (file)
Letter       (file)
mypasswdfile (file)
samples      (directory)
things       (directory)
touchfile    (file)
Run Code Online (Sandbox Code Playgroud)

所以我认为输出应该是这样的:

DocList.txt is a file.
Letter is a file.
mypasswdfile is a file.
samples is a directory.
things is a directory.
touchfile is a file.
Run Code Online (Sandbox Code Playgroud)

但是,这是输出:

DocList.txt is not a file or directory.
Letter is not a file or directory
mypasswdfile is not a file or directory
samples is not a file or directory
things is not a file or directory
touchfile is not a file or directory
Run Code Online (Sandbox Code Playgroud)

我觉得我应该提一下,如果我将$ docs变量设置为`ls~',它将成功显示我的主目录的内容以及这些项是文件还是目录.这不适用于我尝试过的其他路径.

glg*_*lgl 2

您的问题是ls仅输出没有路径的文件名。

所以你$file得到了价值观

DocList.txt
Letter
mypasswdfile
samples
things
touchfile
Run Code Online (Sandbox Code Playgroud)

从循环运行到循环运行。

如果您的当前目录不是 NOT ~/Documents,则测试这些文件名是错误的,因为这会在当前目录中搜索,而不是在预期目录中搜索。

完成任务的更好方法是

for file in ~/Documents/* ; do
    ...
done
Run Code Online (Sandbox Code Playgroud)

它将设置$file为查找文件所需的每个完整路径名。

这样做之后,它应该可以工作,但它很容易出错:一旦你的路径或你的文件之一开始有空格或其他空白字符,它就会落在你的脚上。

放置"可能包含空格等内容的变量是非常重要的。几乎没有理由在没有其周围的情况下使用变量"

这里有什么区别呢?

With [ -f $file ], and file='something with spaces',[用参数-f, something, with, spacesand调用]。这肯定会导致错误的行为。

OTOH,使用[ -f "$file" ]、 和file='something with spaces'[通过参数-fsomething with spaces和进行调用]

所以在shell编程中引用是非常重要的。

当然,对于 也同样如此[ -d "$file" ]