shell中冒号:的作用
I. 在shell 中冒号的作用
- 用作变量条件赋值
{str:=expr}
如果变量str不为空,${str:=expr}就等于str的值,若str为空,就把expr的值赋值给str。
http://codingstandards.iteye.com/blog/1160298
- 用作路径分割符
用途说明
我们知道,在Linux系统中,冒号(:)常用来做路径的分隔符(PATH),数据字段的分隔符(/etc/passwd)等。其实,冒号(:)在Bash中也是一个内建命令,它啥也不做,是个空命令、只起到占一个位置的作用,但有时候确实需要它。当然,它也有它的用途的,否则没必要存在。在·Linux的帮助页中说它除了参数扩展和重定向之外不产生任何作用。
- 只起占位符的作用
- 后面不跟任何命令只起到占位符的作用
man : 写道
- 后面不跟任何命令只起到占位符的作用
- [arguments]
No effect; the command does nothing beyond expanding arguments and performing any specified redirections. A zero exit code is returned.
常用参数
格式:
:
·啥也不做,只起到占位符的作用。比如在编写脚本的过程中,某些语法结构需要多个部分组成,但开始阶段并没有想好或完成相应的代码,这时就可以用:来做占位符,否则执行时就会报错。
if [ "today" == "2011-08-29" ]; then
:
else
:
fi
格式:: your comment here
格式:# your comment here
写代码注释(单行注释)。
格式:: 'comment line1
comment line2
more comments'
写多行注释。
格式:: >file
格式:>file
清空文件file的内容。
格式:: ${VAR:=DEFAULT}
当变量VAR没有声明或者为NULL时,将VAR设置为默认值DEFAULT。如果不在前面加上:命令,那么就会把${VAR:=DEFAULT}本身当做一个命令来执行,报错是肯定的。
使用示例
示例一 参数扩展
[root@node56 ~]# : abc=1234
[root@node56 ~]# echo $abc
[root@node56 ~]# : ${abc:=1234}
[root@node56 ~]# echo $abc
1234
[root@node56 ~]# ${abc:=1234}
-bash: 1234: command not found
[root@node56 ~]#
示例二 清空文件
[root@node56 ~]# cat <<<"Hello" >123.txt
[root@node56 ~]# cat 123.txt
Hello
[root@node56 ~]# : >123.txt
[root@node56 ~]# cat 123.txt
[root@node56 ~]#
示例三 脚本注释、占位符
脚本test_colon.sh
Bash代码 收藏代码
#!/bin/sh
: this is single line comment
: 'this is a multiline comment,
second line
end of comments'
if [ "1" == "1" ]; then
echo "yes"
else
:
fi
[root@node56 ~]# ./test_colon.sh
yes
http://asadman.blog.hexun.com/56958072_d.html
另外, : 有一个side-effect,就是 重定向:
-bash-3.2$ : echo "this is a comment" > word
-bash-3.2$ ls
MakeFileFindtree word
makefile中的冒号有很多用处:
- 赋值的时候用;
- :目标依赖关系
- 还用于分隔不同的目录,如:
SRC_PATH ?= .:..
风格1: 递归扩展变量
(recursively expanded variable)
变量定义格式是,变量和值之间用等号,即 =
例如:
foo = $(bar)
bar = $(ugh)
ugh = Huh?
all:;echo $(foo)
将显示 Huh?
再例如:
CFLAGS = $(include_dirs) -O
include_dirs = -Ifoo -Ibar
缺点是不能这么定义:CFLAGS = $(CFLAGS) -O ,将会死循环
风格2: 简单扩展变量
(simply expanded variables)
变量定义格式是,变量和值之间用冒号等号,即 :=
例如
x := foo
y := $(x) bar
x := later
等价于:
y := foo bar
x := later
另外 ?= 含义为:没有定义则赋值
FOO ?= bar
等价于
ifeq ($(origin FOO), undefined)
FOO = bar
endif
+= 是为变量后面追加字符
变量替换
$(var:a=b),是将 var 变量中每一个单词后面的 a 替换为 b
$(var:suffix=replacement)
等价于
$(patsubst %suffix,%replacement,$(var))
$(foo:%.o=%.c) ,由于出现了 %, 其功能和 patsubst 等价
$(var:pattern=replacement)
等价于
$(patsubst pattern,replacement,$(var))
风格1: 递归扩展变量
(recursively expanded variable)
变量定义格式是,变量和值之间用等号,即 =
例如:
foo = $(bar)
bar = $(ugh)
ugh = Huh?
all:;echo $(foo)
将显示 Huh?
再例如:
CFLAGS = $(include_dirs) -O
include_dirs = -Ifoo -Ibar
缺点是不能这么定义:CFLAGS = $(CFLAGS) -O ,将会死循环
风格2: 简单扩展变量
(simply expanded variables)
变量定义格式是,变量和值之间用冒号等号,即 :=
例如
x := foo
y := $(x) bar
x := later
等价于:
y := foo bar
x := later
另外 ?= 含义为:没有定义则赋值
FOO ?= bar
等价于
ifeq ($(origin FOO), undefined)
FOO = bar
endif
+= 是为变量后面追加字符
变量替换
$(var:a=b),是将 var 变量中每一个单词后面的 a 替换为 b
$(var:suffix=replacement)
等价于
$(patsubst %suffix,%replacement,$(var))
$(foo:%.o=%.c) ,由于出现了 %, 其功能和 patsubst 等价
$(var:pattern=replacement)
等价于
$(patsubst pattern,replacement,$(var))
风格1: 递归扩展变量
(recursively expanded variable)
变量定义格式是,变量和值之间用等号,即 =
例如:
foo = $(bar)
bar = $(ugh)
ugh = Huh?
all:;echo $(foo)
将显示 Huh?
再例如:
CFLAGS = $(include_dirs) -O
include_dirs = -Ifoo -Ibar
缺点是不能这么定义:CFLAGS = $(CFLAGS) -O ,将会死循环
风格2: 简单扩展变量
(simply expanded variables)
变量定义格式是,变量和值之间用冒号等号,即 :=
例如
x := foo
y := $(x) bar
x := later
等价于:
y := foo bar
x := later
另外 ?= 含义为:没有定义则赋值
FOO ?= bar
等价于
ifeq ($(origin FOO), undefined)
FOO = bar
endif
+= 是为变量后面追加字符
变量替换
$(var:a=b),是将 var 变量中每一个单词后面的 a 替换为 b
$(var:suffix=replacement)
等价于
$(patsubst %suffix,%replacement,$(var))
$(foo:%.o=%.c) ,由于出现了 %, 其功能和 patsubst 等价
$(var:pattern=replacement)
等价于
$(patsubst pattern,replacement,$(var))
将显示 Huh?
再例如:
CFLAGS = $(include_dirs) -O
include_dirs = -Ifoo -Ibar
缺点是不能这么定义:CFLAGS = $(CFLAGS) -O ,将会死循环
风格2: 简单扩展变量
(simply expanded variables)
变量定义格式是,变量和值之间用冒号等号,即 :=
例如
x := foo
y := $(x) bar
x := later
等价于:
y := foo bar
x := later
另外 ?= 含义为:没有定义则赋值
FOO ?= bar
等价于
ifeq ($(origin FOO), undefined)
FOO = bar
endif
+= 是为变量后面追加字符
变量替换
$(var:a=b),是将 var 变量中每一个单词后面的 a 替换为 b
$(var:suffix=replacement)
等价于
$(patsubst %suffix,%replacement,$(var))
$(foo:%.o=%.c) ,由于出现了 %, 其功能和 patsubst 等价
$(var:pattern=replacement)
等价于
$(patsubst pattern,replacement,$(var))
风格2: 简单扩展变量
(simply expanded variables)
变量定义格式是,变量和值之间用冒号等号,即 :=
例如
x := foo
y := $(x) bar
x := later
等价于:
y := foo bar
x := later
另外 ?= 含义为:没有定义则赋值
FOO ?= bar
等价于
ifeq ($(origin FOO), undefined)
FOO = bar
endif
+= 是为变量后面追加字符
变量替换
$(var:a=b),是将 var 变量中每一个单词后面的 a 替换为 b
$(var:suffix=replacement)
等价于
$(patsubst %suffix,%replacement,$(var))
$(foo:%.o=%.c) ,由于出现了 %, 其功能和 patsubst 等价
$(var:pattern=replacement)
等价于
$(patsubst pattern,replacement,$(var))
变量替换
$(var:a=b),是将 var 变量中每一个单词后面的 a 替换为 b
$(var:suffix=replacement)
等价于
$(patsubst %suffix,%replacement,$(var))
$(foo:%.o=%.c) ,由于出现了 %, 其功能和 patsubst 等价
$(var:pattern=replacement)
等价于
$(patsubst pattern,replacement,$(var))
$(var:pattern=replacement)
等价于
$(patsubst pattern,replacement,$(var))
关于第一种用法:
Makefile里的=显然是赋值的用法