冒号在shell中的作用

linux shell 内建命令:冒号

介绍

Linux 系统中,冒号(:)常用来做路径的分隔符(如在PATH),数据字段的分隔符(如在 /etc/passwd)等。其实,冒号(:)在 Bash 中也是一个内建命令,它啥也不做,是个空命令、只起到占一个位置的作用,但有时候确实需要它。当然,它也有它的用途的,否则没必要存在。在 Linux 的帮助页中说它除了参数扩展和重定向之外不产生任何作用。

gnu 帮助:http://www.gnu.org/software/bash/manual/bash.html#Bourne-Shell-Builtins

作用

冒号(:)的作用

  1. 空命令
  2. 参数扩展
  3. 重定向
  4. 当注释使用

空命令

空命令就是什么也不做,所以返回码永远都是 0 。虽说是空命令,但仍是命令,就具备一般命令应有的特征,可以象一般命令一样使用。如

1
2
3
4
[root@localhost test]# :
[root@localhost test]# echo $?
0
[root@localhost test]#

可以直接在console中执行。返回码为0。

利用这一特性,:可以当 true 使用。如用在 while 等循环体中的条件判断。

参数扩展

冒号引起的参数扩展,意思是将参数的值替换为新的值。一般有以下几种参数扩展用法:

1
2
3
4
5
6
7
${parameter:-word}    #如果parameter没有设置或者为空,替换为word;否则替换为parameter的值
${parameter:+word}    #如果parameter没有设置或者为空,不进行任何替换;否则替换为word。
${parameter:=word}    #如果parameter没有设置或者为空,把word赋值给parameter。实际parameterd的值真的被替换了,这就是=号的意思。不能用这种方式指派位置参数或特殊参数的值。
${parameter:?word}    #如果parameter没有设置或者为空,把word输出到stderr,否则替换为parameter的值。     
# -、+、? 实际parameter的值并不被修改,扩展只是临时显示成word的值。准确的讲,扩展实际替换的是参数的显示,而不是参数的定义。只有=,才是替换参数的定义。
${parameter:offset}    #扩展为parameter中从offset开始的子字符串。
${parameter:offset:length}     #扩展为parameter中从offset开始的长度不超过length的字符。

三元运算符

1
2
var=100
(($var>100?var++:var--))

重定向

1
2
3
: > test.file

cat test.file

cat 文件内容,什么都没有。

注释

使用冒号还可以用作注释行的开始,但是如果有语法错误,仍将报错,这一点与使用 # 号不同。如:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
[root@localhost test]# cat test.sh

fun()
{
   echo 1222
   : cccccc
   # llllll
   echo 222221
}

fun

[root@localhost test]# sh test.sh
1222
222221

参考:
https://www.cnblogs.com/ChinaGo/p/9910747.html

Licensed under CC BY-NC-SA 4.0
Built with Hugo
主题 StackJimmy 设计