bash 提供了丰富的展开替换功能, 都是一些和大括号有关的操作。主要分为两个类别。 第一:根据一个变量是否存在并且非空为条件进行返回值或者显示信息。 第二:字符串处理。
四种展开的方式
表达式 | name存在 | name不存在 |
---|---|---|
${varname:-word } | 返回name的值 | 返回word |
${varname:=word } | 返回name的值 | 设置成word的值 |
${varname:?message} | 返回name的值 | 显示 varname:mesage |
${varname:+word} | 返回word的值 | 返回 null |
如果变量存在只有+返回的是null,其他返回的都是该值。 变量存在返回的都是值,不一定是原来的值
如果变量不存在加号返回null,减号返回word 。 等号是设置值, 问号是显示信息。 变量不存在,效果各不同
name=bob
#bob bob
echo -n {name:-no user}; echo -n -e "\t"; echo{name}
#no user
echo -n {name_var:-no user}; echo -n -e "\t"; echo{name_var}
#bob bob
echo -n {name:=no user}; echo -n -e "\t"; echo{name}
#no user no user
echo -n {name_var:=no user}; echo -n -e "\t"; echo{name_var}
#bob bob
echo -n {name:?no user}; echo -n -e "\t"; echo{name}
#no user no user
echo -n {name_var:?no user}; echo -n -e "\t"; echo{name_var}
#bob bob
echo -n {name:?no user}; echo -n -e "\t"; echo{name}
#no user no user
echo -n {name_var:?no user}; echo -n -e "\t"; echo{name_var}
对变量的修改, 三大类,六小类。
形式 | 含义 |
---|---|
${var#key} | 从头开始删除,最短匹配 |
${var##key} | 从头开始删除,最长匹配 |
${var%key} | 从尾删除,最短匹配 |
${var%%key} | 从尾删除,最长匹配 |
${var/old/new} | 仅仅替换一次把, old替换成new |
${var//old/new} | 全部替换 |
可以用*来代替任意字符
USR=(head -1 /etc/passwd)
echoUSR #root:x:0:0:root:/root:/bin/bash
echo {USR#*:} # x:0:0:root:/root:/bin/bash
echo{USR##*:} # /bin/bash
echo {USR\%:*} # root:x:0:0:root:/root
echo{USR\%\%:*} # root
echo {USR/root/admin} # admin:x:0:0:root:/root:/bin/bash
echo{USR//root/admin} # admin:x:0:0:admin:/admin:/bin/bash