bash变量操作与模式匹配用法
1、变量的扩展操作:
${:-word}如果变量存在非空,返回其值,否则返回默认值word
=${1:-/dev/tty},如果位置参数为空,则返回/dev/tty
${:=word}如果变量存在非空,返回其值,否则赋值为word并返回其值
${:?}如果变量存在非空,返回其值,否则打印:,并
退出该命令或者脚本
${:+word}如果存在且非空,返回word,否则返回null,
可以用来测试变量是否存在$(count:+1}
2、模式匹配操作:
比如:path=/home//mem/long.file.name
${#},如果匹配变量开始,删除最短匹配,并返回剩余部分
${path#/*/}返回/mem/long.file.name
${##}如果匹配变量开始,删除最长匹配,并返回剩余部分
${path##/*/返回long.file.name
${%,如果匹配变量结尾,删除最短匹配,并返回剩余部分
${path%.*}返回/home//mem/long.file
${%%}如果匹配变量结尾,删除最长匹配,并返回剩余部分
${%%.*}返回/home//mem/long
返回字符串长度:
x=
echo ${#x}
3、特殊变量:
# 代表参数的个数
@ 命令行参数,"$@"扩展为原来单独的多个参数,要将原来的参数传递给另一个函数使用"$@"
* 命令行参数,"$*"扩展为一个参数
? 前一个命令的退出状态
$ shell进程的id
0 shell进程的名字
! 最后一个后台运行命令的进程id,可以使用它来保存该进程id,以便wait操作。
IFS 内部文本域的分割,通常为空格,tab或者换行
PS1 主命令行提示符,默认为$
PS2 行延续的提示符,默认为>
PS4 使用set -x提示符,默认为+
PWD 当前的工作目录

4、使用退出状态的if-else-fi
if grep "abc" file > /dev/null
then
echo "find abc in file"
else
echo "not find abc in file"
fi
如果执行成功 exit状态为0,执行if,否则执行else
可以使用&
grep "abc" file >/dev/null &{
echo "find abc in file"
}
5、break,可以带数字参数表示退出层数
while condition1 Outer loop
do ...
while condition2 Inner loop
do ...
break 2 Break out of outer loop
done
done
6、sed
1)执行多个替换
sed 's;/home/tolstoy/;/home/lt/;'
s后面可以指定分割:
比如:
sed 's/\/usr\/local\/bin/\/common\/bin/'new
可以通过指定|分割,把上面的命令变得更整洁:
sed 's|/usr/local/bin|/common/bin|'new
2)使用&
我们想在单词的两边加上括号
echo "hello 123" | sed 's/[a-z]*/(&)/' new
可以使用多次
echo "hello 123" | sed 's/[a-z]*/(&)(&)/' new
3)使用行数指定范围:
sed '1,100 s/A/a/' sed '100,$ s/A/a/'
4)使用d删除
sed -e 's/#.*//' -e '/^$/ d'
上面代码用来删除空行和注释
5)使用p达到grep的功能
sed -n '/pattern/ p' #打印匹配行 sed -n '/pattern/ !p'6)使用 {}来group多个操作:
删除begin,end之间的空行和注释:
sed -n ' /begin/,/end/ { s/#.*// s/[ ^I]*$// /^$/ d p } '7)使用w来写入文件
比如把文件file中偶数找到,并放在even文件中:
sed -n 's/^[0-9]*[02468] /&/w even'sed参考
返回 sed 使用 匹配 变量 如果























