bash 空运算符“:”,冒号有什么意义?

Jus*_*tin 13 bash scripts syntax

BASH 脚本中的“空”运算符有什么意义?我知道if当您无话可说但需要一个命令来让程序正常运行时,它被用作命令后面的占位符。但它的总体用途是什么?你会在什么时候使用它?什么时候使用它才有意义?

gle*_*man 17

允许参数扩展的副作用发生有时很有用。

例如,设置默认值

read -p "Enter your name: " name
: ${name:=John Doe}  # if the user entered an empty string
echo "$name"
Run Code Online (Sandbox Code Playgroud)

  • 为了概述@glennjackman 所引用的内容,第二行调用了空命令 :,并且 `${name:="John Doe"}` 将被扩展,导致赋值发生,因为它被读取为 : 的参数。如果没有:shell 将尝试运行“John Doe”作为命令,或者如果已经设置了值 `$name` (5认同)
  • 你能逐个解释第二行是如何工作的吗? (2认同)

cho*_*oba 13

您还可以将其用于无限循环:

while : ; do 
   # ....
done
Run Code Online (Sandbox Code Playgroud)

  • 但也许 `while true` 更具可读性,因为 (a) 它使用较少的标点符号,并且 (b) 它更类似于 C 派生语言。 (4认同)

G-M*_*ca' 9

您可以使用它在不运行程序的情况下创建文件:

: > /path/to/file
Run Code Online (Sandbox Code Playgroud)

这比touch /path/to/file (因为它不需要运行touch程序)快得多,并且可能比简单的更便携

> /path/to/file
Run Code Online (Sandbox Code Playgroud)

这似乎适用于许多系统。同样,它可用于检查您是否对文件具有写权限

if { : >> /path/to/file;} 2> /dev/null
then
    echo "writeable"
else
    echo "write permission denied"
fi
Run Code Online (Sandbox Code Playgroud)

尽管这通常也可以在没有:. 注意事项:

  • 这不会检查文件是否已经存在。如果没有,如果它有这样做的权限,这将创建文件。
  • 如果该文件不存在,并且您的脚本没有创建它的权限,则会报告“写入权限被拒绝”。

(有关为什么这比 更可靠的原因,请参阅链接的问题if [ -w /path/to/file ]。)


Ser*_*nyy 5

回想起来,在 Unix V6 和 Thompson Shell 中,:实际上将 用作goto语句的一部分。根据手册,它最初出现在 Unix 版本 3 中:

在整个命令文件中搜索以 : 作为第一个非空白字符开头的行,然后是一个或多个空格,然后是标签。如果找到这样的行,goto 将命令文件偏移重新定位到标签后的行并退出。这会导致外壳转移到标记线。

如今,在 中bash,它被用作无操作运算符,返回成功。事实上,如果你看看源代码,你会看到,无论是true:使用相同的功能,int colon_builtin(),下面。没有:非内置命令,/bin/true它实际上是一个相当大的命令

:可以在任何使用的地方true使用,例如 in command_that_can_fail || true,尽管这可能会使非专家感到困惑。在此处阅读更多相关信息。