一、环境

ubuntu14.04 x86_64


二、变量默认值

2.1 ${vari:-defaultValue}

当var没有定义时,此时使用defaultValue, 而vari依然为空,没有改变值

eg:
在终端上操作

#echo${name}#//因为name没有定义,结果为空#echo${name:-chaoge}#chaoge//没有定义name,使用默认值chaoge#echo${name}#//依然为空,并未改并name变量的值



2.2${vari:=defaultValue}

当vari没有定义时,此时使用defaultValue, 同时vari也被赋值为defaultValue

eg:

在终端上操作

#echo${name}#//因为name没有定义,结果为空#echo${name:=chaoge}#chaoge//没有定义name,使用默认值chaoge#echo${name}#chaoge//name变量的值已经被改变

2.3 ${vari:?value}

当vari没有定义时,或者定义了值为空,将在终端报错并且退出,用于检查是否定义以及是否为空

eg.

>echo${name}>//因为没有定义name,所以输出为空>echo${name:?zhangsan}>bash:name:zhangsan//因为没有定义name,报错并退出>echo${name:?}>bash:name:参数为空或未设置>name=//定义name变量,但是值为空>echo${name:?}>bash:name:参数为空或未设置>name=lisi//设置了name的值>echo${name:?}>lisi//正常输出name的值

2.4 ${vari:+value}

当vari定义并且不为空,将用value替换vari的值,否则什么也不做, 与${vari:-value}相反

eg:

>echo${myhome:+beijing}>//因为没有定义myhome,所以为空>myhome=//定义myhome,但为空>echo${myhome:+beijing}>>myhome=shanghai//设置变量的值>echo${myhome:+beijing}>beijing//此时myhome定义了并且不为空,则替换为beijing了


三、应用

3.1 Makefile

eg: linux内核中其中一个Makefile中的

#Defaultvaluehead-y:=arch/arm/kernel/head$(MMUEXT).oarch/arm/kernel/init_task.otextofs-y:=0x00008000

3.2 函数默认参数

和c++的默认参数异曲同工之妙

default_parameters.cpp

#include<iostream>voidfunc(inti=1,doubled=2.0,floatf=3.0){std::cout<<i<<","<<d<<","<<f<<std::endl;}intmain(intargc,char*args[]){func();func(10);func(10,99.9);func(20,33.3,9.3f);return0;}

#g++ default_parameters.cpp

#./a.out
1, 2, 3
10, 2, 3
10, 99.9, 3
20, 33.3, 9.3

default_parameters.sh

#!/bin/bashfunc(){echo"${1:-10},${2:-10.2},${3:-zhangsan}"}funcfunc23func2312.0func3423.0lisi

#bash default_parameters.sh

10, 10.2, zhangsan
23, 10.2, zhangsan
23, 12.0, zhangsan
34, 23.0, lisi


这样就可以让函数呈现多态性