bash ${} 属于参数替换一类,用man bash 可以输出完整帮助文档,查找参数替换部分可阅读帮助.
一: bash 字符串操作:
例: FILE_NAME=”/usr/local/world.txt”
1. 取字符串长度
${#FILE_NAME}
2. 取子串
${FILE_NAME:10} #从位置10开始取字串
${FILE_NAME:5:10} #从位置5开始,取10个字符
3. 删除字符串(匹配)
${FILE_NAME##*/} #删除从左开始到/ 止的所有字符, 最大匹配
${FILE_NAME#*/} #删除从左开始到/ 止的所有字符, 最小匹配
${FILE_NAME%%/*} #删除从右开始到左/ 止的所有字符,最大匹配
${FILE_NAME%/*} #删除从右开始到左/ 止的所有字符,最小匹配
关键是理解#,%,*元字符的作用,#是左,%是右开始,*多字符匹配。左trim,右trim之意!
上面那个/是普通的字符。不要混淆。
另见例子:
${FILE_NAME#*local}, ${FILE_NAME##*local}
${FILE_NAME%local*} ${FILE_NAME%%local*}
4. 替换字符串 (也使用匹配操作)
${FILE_NAME/world.txt/hello.txt} # 将world.txt 替换成hello.txt
${FILE_NAME//w/W} # 将w 全部换成 W
/元字符是查找替换之意
就是说它有左trim, 右trim 及查找替换功能.
对应的函数原型为:
${#string} $string的长度
${string:position} 在$string中, 从位置$position开始提取子串
${string:position:length} 在$string中, 从位置$position开始提取长度为$length的子串
${string#substring} 从变量$string的开头, 删除最短匹配$substring的子串
${string##substring} 从变量$string的开头, 删除最长匹配$substring的子串
${string%substring} 从变量$string的结尾, 删除最短匹配$substring的子串
${string%%substring} 从变量$string的结尾, 删除最长匹配$substring的子串
${string/substring/replacement} 使用$replacement, 来代替第一个匹配的$substring
${string//substring/replacement} 使用$replacement, 代替所有匹配的$substring
可见, bash 内置函数,其函数名称,输入参数,调用方法,返回值与|C 非常不同。
它用了一种更简单的书写方式。
${}内对变量进行赋值和变量引用, 用echo 命令可以实验
=变量不存在,赋值并传回,有值(包括空值)无操作,但会传回原来值
:=变量不存在或为空,赋值并传回
-变量不存在,传回默认值,有值传原值
:-变量不存在或为空,传回默认值,非空值传回原值
+变量不存在,不操作,有值时用新值覆盖
:+变量不存在或为空,不操作,非空用新值覆盖
?变量不存在,新值输出至STDERR
:?变量不存在或为空,新值输出至STDERR
举例:
${file=my.file.txt} :若$file 不存在,则使用 my.file.txt 作传回值,同时将$file 赋值为 my.file.txt.
${file:=my.file.txt} :若$file 不存在或为空值,则使用my.file.txt 作传回值,同时将 $file 赋值为 my.file.txt .
${file-my.file.txt} :若$file 不存在,则使用 my.file.txt 作传回值。
${file:-my.file.txt} :若$file 不存在或为空值,则使用 my.file.txt 作传回值。
${file+my.file.txt} :若$file 不存在,不做处理,若为空值或非空值,均使用 my.file.txt 作传回值.
${file:+my.file.txt} :若$file为非空值,则使用 my.file.txt 作传回值。
${file?my.file.txt} :若$file 不存在,则将 my.file.txt 输出至 STDERR。
${file:?my.file.txt} :若$file 不存在或为空值,则将 my.file.txt 输出至 STDERR。
${var:n:m} 取字串,前面有例子
${var} (%,#,%%,##)操作根据模板删除字串,前面说过
(//) 字符串替换,前面说过。
二: Bash 取得命令行参数
$#, $1,$2,$3
枚举命令行参数: for a in $@ { echo $a; }
—————————————-
三:执行bash如何让命令回显?
bash -v test.sh
或#!/bin/bash -v
-x 执行前打印
-n 只运行不执行
—————————————-
四: bash 输出等宽数字到变量
$ printf -v str “%06d\n” 15
$ echo $str
000015
—————————————-
其它: bash 替换字符串中的/为空格, 还得借助sed 才比较方便:
echo $FILE_NAME |sed ‘s#/# #g’
—————————————-
五: bash 的执行顺序:
—————————————-
别名,函数,内置命令,外部命令
—————————————-
六:关于bash的有用的几个辅助命令
—————————————-
alias 显示所有alias 定义
declare -F 显示所有的函数定义
declare -f 显示所有的函数定义及内容
help 给出所有的内部命令的帮助, 具体的帮助用 help <item>
hash -l 显示命令hash表
enable 判断一个命令是否是内置命令, 例如: enable ls
enable -a 列出所有的内部命令
type 也可以判断一个命令是什么类型,例如: type ls
alias,declare,enable,hash,type都是内置命令。
最常见和常用的内置命令是cd 命令,其次pwd.alias 命令,
写脚本语言常用的if then,fi;while do,done;for do,done; case in,esac;也是内部命令
用help,及enables 查看所有内部命令。