编写一个脚本“test.sh”,该脚本会测试当前目录中是否存在名为“goodbye”的文件,如果该文件在当前目录中,则打印“I am here”。
我在“word文档”中得到了这个问题,没有事先解释,这就是我得到的问题,我想我应该使用 test.sh 编写一个脚本来查看文件 goodbye 是否在当前目录中,如果如果文件在那里,它应该打印“我在这里”。但我不知道如何使用 test.sh。
我所做的代码仍然不确定:
cisco@ubuntu:~$ > goodbye
if [ -f goodbye ]; then
echo "I am here"
fi
答案1
问题并不像看起来那么容易,因为您需要首先定义您的意思文件并由存在。
- 是一个目录、一个 fifo、一个符号链接、一个设备...文件。
-f
该实用程序的运算符[
仅返回 true常规文件或可以确定最终解析为的符号链接常规文件并排除上述所有情况。 - 在目录中找到该名称的目录条目是否足以声明其存在,或者我们是否必须能够访问
lstat()
该文件(检查路径是否解析为实际文件)或stat()
(检查路径是否解析为符号链接解析后的实际路径)。
那么,如果当前目录不可读或不可搜索怎么办?我们是否应该将其视为错误并中止,而不是可能错误地声明该文件不存在?
if [ -f file ]; then
echo I am here
fi
file
如果在符号链接解析后可以成功识别为常规文件,则将输出“我在这里” ,如果file
不存在或文件不是常规文件(在符号链接解析后确定),则不会输出“我在这里”,或者文件的类型可以因某种原因而无法确定。对当前工作目录的搜索访问权限是必要的,但不需要读取访问权限。
if [ -e file ]; then
echo I am here
fi
相同,只是文件可以是任何类型。如上所述,如果“我在这里”file
是我们无法解析的符号链接(因为链接已损坏或指向用户无权访问的区域),则不会输出。
if [ -e file ] || [ -L file ]; then
echo I am here
fi
file
相同,但还涵盖了符号链接损坏的情况。
如果当前工作目录不可搜索,它可能会给您一个误报。如果自您cd
进入目录后目录的权限已更改,或者进程凭据已更改,则可能会发生这种情况。
使用:
if ls -d file > /dev/null; then
echo I am here
fi
会做同样的事情[ -e file ] || [ -L file ]
,并给出一个错误,解释为什么找不到该文件。
在zsh
shell中,还可以使用$ERRNO
特殊变量来找出原因。
如果您没有当前目录的搜索权限,但有读取权限并知道其完整路径,您仍然可以检查其中是否有file
文件条目,例如(假设有 POSIX shell,例如 bash ):
set -- "$PWD"/[f]ile
case $1 in
(*/file) echo "I am here"
esac
(请注意,可能存在$PWD
无法匹配当前工作目录的路径的极端情况,这可能会给您带来误报)。
看这是我对 stackoverflow 上类似问答的回答了解更多信息。
答案2
#!/bin/bash
[ -f goodbye ] && echo "I am here"