使用#,%截取
假设变量file=/dir1/dir2/dir3/my.conf.txt,可以用${}分别替换得到不同的值
# #以及##的使用
${file#*/} 删掉第一个 / 及其左边的字符串:dir1/dir2/dir3/my.conf.txt
${file##*/} 删掉最后一个 / 及其左边的字符串:my.conf.txt
${file#*.} 删掉第一个 . 及其左边的字符串:conf.txt
${file##*.} 删掉最后一个 . 及其左边的字符串:txt
# %以及%%的使用
${file%/*}:删掉最后一个 / 及其右边的字符串:/dir1/dir2/dir3
${file%%/*}:删掉第一个 / 及其右边的字符串:(空值)
${file%.*}:删掉最后一个 . 及其右边的字符串:/dir1/dir2/dir3/my.conf
${file%%.*}:删掉第一个 . 及其右边的字符串:/dir1/dir2/dir3/my
#,##,%以及%%含义及记忆方法:
- #是从左边开始,去除左边的内容(也只能去除左边的内容)
- ##是从右边开始,去除左边的内容(也只能去除左边的内容)
- %是从右边开始,去除右边的内容(也只能去除右边的内容)
- %%是从左边开始,去除右边的内容(也只能去除右边的内容)
记忆方法:以$为准,#在$的左边,所以左边开始去除特定符号及左边内容,%在$的右边,所以右边开始去除特定符号及右边边内容。单一符号最小匹配,两个符号最大匹配
使用数字进行截取
${file:0:5}:提取最左边的 5 个字节:/dir1
${file:5:5}:提取第 5 个字节右边的连续5个字节:/dir2
使用${}对变量中字符串进行替换
${file/dir/path}:将第一个dir 替换为path:/path1/dir2/dir3/my.conf.txt
${file//dir/path}:将全部dir 替换为 path:/path1/path2/path3/my.conf.txt
使用${}对变量状态赋值(未设定、空值、非空值)
${file-my.conf.txt} :假如 $file 沒有设定,使用 my.file.txt 作为传回值。(空值及非空值时不作处理)
${file:-my.conf.txt} :假如 $file 沒有设定或为空值,使用 my.file.txt 作为传回值。 (非空值时不作处理)
${file+my.conf.txt} :假如 $file 设为空值或非空值,均使用 my.file.txt 作为传回值。(沒設定时不作处理)
${file:+my.conf.txt} :若 $file 为非空值,使用 my.file.txt 作为传回值。 (未设定及空值时不作处理)
${file=my.conf.txt} :若 $file 沒设定,使用 my.file.txt 作为传回值,同时将 $file 赋值为 my.file.txt 。 (空值及非空值时不作处理)
${file:=my.conf.txt} :若 $file 没设定或为空值,使用 my.file.txt 作为传回值,同时将 $file 赋值为 my.file.txt 。 (非空值时不作处理)
${file?my.conf.txt} :若 $file 没设定,将 my.file.txt 输出至 STDERR(提示信息)。 (空值及非空值时不作处理)
${file:?my.conf.txt} :若 $file 没设定或为空值,则将 my.file.txt 输出至 STDERR(提示信息)。 (非空值时不作处理)
${#var} 可计算出变量值的长度:
${#file} 可得到 27 ,因为/dir1/dir2/dir3/my.conf.txt 是27个字节