if [ -r "$1" ] ; 是什么意思?意思是?

if [ -r "$1" ] ; 是什么意思?意思是?

我对 shell 比较陌生(现在只是它的基础知识)。我试图理解一个脚本以修复一个错误,但我偶然发现了一些我无法通过谷歌找到答案的东西(可能没有谷歌搜索到正确的东西)。

if [ -r "$1" ] ; 

我非常熟悉控制流,我也知道这$1是传递给脚本的参数。我不知道我们正在评估的实际表达式:-r

任何帮助将不胜感激!

答案1

[使用-r运算符和第一个位置参数的内容(如果未设置位置参数,则为空字符串)作为-r运算符的操作数(以及对称性的闭合])来运行命令。

[命令内置于所有类似 Bourne 的 shell(和fish)中。所以它的文档一般可以在相应的shell手册中找到。它也被称为test.

根据您的外壳,尝试:

  • info zsh test
  • info bash '['
  • fish -c 'help test'
  • man ksh/ man dash...对于那些没有信息页的 shell。

(请注意,在某些系统上,需要安装一个bash-doczsh-doc软件包才能使文档info格式可用于这些 shell)。

系统通常还具有一个独立的命令[test具有类似接口的命令,可以从其他类型的 shell 或非 shell 的事物中使用,并且不使用 shell 来运行命令(例如envfind -exec...)。该文档可以在info testman testman '['也可能)找到。

具体来说,-r操作员要测试运行该命令的进程[(内置的 shell [)是否有权打开给定文件阅读。如果为真,则该[命令返回一个成功退出状态,在这种情况下该if语句执行该then部分。

这相当于access(argv[1], R_OK)C 中的情况。

答案2

询问-r:用户是否具有$1操作数标识的文件的读取权限?

test该实用程序的 POSIX 规范包含所有标准运算符的列表。

他们之中有一些是:

-e file exists
-f file is a regular file (not a directory or device file)
-s file is not zero size
-d file is a directory
-b file is a block device
-c file is a character device
-p file is a pipe
-L file is a symbolic link
-S file is a socket
-t file (descriptor) is associated with a terminal device
-r file has read permission (for the user running the test)
-w file has write permission (for the user running the test)
-x file has execute permission (for the user running the test)

相关内容