我正在尝试编写一个 Bash 脚本,该脚本将文件或目录的名称作为参数,并报告该文件是否是目录、常规文件或其他文件。该脚本还应报告用户是否具有文件或目录的读、写和执行权限。
显然这样的事情会得到原始信息:
#!/bin/sh
read -p "Enter a filename: " fname
file $fname
ls -la $fname
但是,我想知道我们是否可以完全删除 file 命令,将 filename 变量传递给 ls,然后根据结果编写某种 if、then、else 语句。 ls 命令提供文件类型以及运行该命令的用户对该文件拥有的权限的完整细分,因此我可以根据 ls 命令的结果进行自定义输出吗?
答案1
您可以使用 shell 测试来检查文件类型和权限:
#!/bin/sh
read -rp 'Enter a filename: ' fname
if [ -f "$fname" ]; then
echo 'File is a regular file'
elif [ -d "$fname" ]; then
echo 'File is a directory'
else
echo 'File is not a regular file or a directory'
fi
[ -r "$fname" ] && read=read
[ -w "$fname" ] && write=write
[ -x "$fname" ] && execute=execute
echo "User has ${read} ${write} ${execute} permissions" | tr -s ' '
if 结构将通过检查它是常规文件 ( -f
) 还是目录 ( -d
) 来报告文件类型,否则它将报告两者都不是。
然后我们检查各种权限:读(-r
)、写(-w
)和执行(-x
)。为每个设置一个变量。如果用户没有这些权限之一,则相应的变量将保持未设置状态,因此在最后的回显行中,如果用户没有该权限,则变量将扩展为空。最后通过调用tr -s ' '
删除不存在的权限中可能存在的任何额外空格来完成此操作。