您的位置:首页 > 运维架构 > Shell

shell中的冒号“:”--个人整理总结版-注意与makfle中:的区别

2011-12-15 11:17 399 查看
http://www.cppblog.com/prayer/archive/2009/05/27/85884.html

{str:=expr}

如果变量str不为空,${str:=expr}就等于str的值,若str为空,就把expr的值赋值给str。

/content/2936805.html



用途说明

我们知道,在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.


常用参数

格式::

·啥也不做,只起到占位符的作用。比如在编写脚本的过程中,某些语法结构需要多个部分组成,但开始阶段并没有想好或完成相应的代码,这时就可以用:来做占位符,否则执行时就会报错。

Bash代码



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中的冒号有很多用处:

1.赋值的时候用;

2.“:目标依赖关系

3.还用于分隔不同的目录,如:

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里的=显然是赋值的用法
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: