我对 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-doc
或zsh-doc
软件包才能使文档info
格式可用于这些 shell)。
系统通常还具有一个独立的命令[
或test
具有类似接口的命令,可以从其他类型的 shell 或非 shell 的事物中使用,并且不使用 shell 来运行命令(例如env
,find -exec
...)。该文档可以在info test
或man test
(man '['
也可能)找到。
具体来说,-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)