1、变量的扩展操作:
${varname:-word}如果变量存在非空,返回其值,否则返回默认值word
filename=${1:-/dev/tty},如果位置参数为空,则返回/dev/tty
${varname:=word}如果变量存在非空,返回其值,否则赋值为word并返回其值
${varname:?message}如果变量存在非空,返回其值,否则打印varname:message,并
退出该命令或者脚本
${varname:+word}如果varname存在且非空,返回word,否则返回null,
可以用来测试变量是否存在$(count:+1}
2、模式匹配操作:
比如:path=/home/tolstoy/mem/long.file.name
${variable#pattern},如果pattern匹配变量开始,删除最短匹配,并返回剩余部分
${path#/*/}返回tolstoy/mem/long.file.name
${variable##pattern}如果pattern匹配变量开始,删除最长匹配,并返回剩余部分
${path##/*/返回long.file.name
${variable%pattern,如果pattern匹配变量结尾,删除最短匹配,并返回剩余部分
${path%.*}返回/home/tolstoy/mem/long.file
${variable%%pattern}如果pattern匹配变量结尾,删除最长匹配,并返回剩余部分
${pattern%%.*}返回/home/tolstoy/mem/long
返回字符串长度:
x=supercalifragilisticexpialidocious
echo ${#x}
3、特殊变量:
# 代表参数的个数
@ 命令行参数,"$@"扩展为原来单独的多个参数,要将原来的参数传递给另一个函数使用"$@"
* 命令行参数,"$*"扩展为一个参数
? 前一个命令的退出状态
$ shell进程的id
0 shell进程的名字
! 最后一个后台运行命令的进程id,可以使用它来保存该进程id,以便wait操作。
IFS 内部文本域的分割,通常为空格,tab或者换行
PS1 主命令行提示符,默认为$
PS2 行延续的提示符,默认为>
PS4 使用set -x提示符,默认为+
PWD 当前的工作目录
4、使用退出状态的if-else-fi
[code]
if grep "abc" file > /dev/null
then
echo "find abc in file"
else
echo "not find abc in file"
fi
[/code]
如果执行成功 exit状态为0,执行if,否则执行else
可以使用&
[code]
grep "abc" file >/dev/null &{
echo "find abc in file"
}
[/code]
5、break,continue可以带数字参数表示退出层数
[code]
while condition1 Outer loop
do ...
while condition2 Inner loop
do ...
break 2 Break out of outer loop
done
done
[/code]
6、sed
1)执行多个替换
[code]
sed 's;/home/tolstoy/;/home/lt/;'
[/code]
s后面可以指定分割:
比如:
[code]
sed 's/\/usr\/local\/bin/\/common\/bin/' <old >new
[/code]
可以通过指定|分割,把上面的命令变得更整洁:
[code]
sed 's|/usr/local/bin|/common/bin|' <old >new
[/code]
2)使用&
我们想在单词的两边加上括号
[code]
echo "hello 123" | sed 's/[a-z]*/(&)/' <old >new
[/code]
可以使用多次
[code]
echo "hello 123" | sed 's/[a-z]*/(&)(&)/' <old >new
[/code]
3)使用行数指定范围:
[code]
sed '1,100 s/A/a/'
sed '100,$ s/A/a/'
[/code]
4)使用d删除
[code]
sed -e 's/#.*//' -e '/^$/ d'
[/code]
上面代码用来删除空行和注释
5)使用p达到grep的功能
[code]
sed -n '/pattern/ p' #打印匹配行
sed -n '/pattern/ !p' </tmp/b #打印不匹配行
[/code]
6)使用 {}来group多个操作:
删除begin,end之间的空行和注释:
[code]
sed -n '
/begin/,/end/ {
s/#.*//
s/[ ^I]*$//
/^$/ d
p
}
'
[/code]
7)使用w来写入文件
比如把文件file中偶数找到,并放在even文件中:
[code]
sed -n 's/^[0-9]*[02468] /&/w even' <file
[/code]
sed参考http://www.grymoire.com/Unix/Sed.html
${varname:-word}如果变量存在非空,返回其值,否则返回默认值word
filename=${1:-/dev/tty},如果位置参数为空,则返回/dev/tty
${varname:=word}如果变量存在非空,返回其值,否则赋值为word并返回其值
${varname:?message}如果变量存在非空,返回其值,否则打印varname:message,并
退出该命令或者脚本
${varname:+word}如果varname存在且非空,返回word,否则返回null,
可以用来测试变量是否存在$(count:+1}
2、模式匹配操作:
比如:path=/home/tolstoy/mem/long.file.name
${variable#pattern},如果pattern匹配变量开始,删除最短匹配,并返回剩余部分
${path#/*/}返回tolstoy/mem/long.file.name
${variable##pattern}如果pattern匹配变量开始,删除最长匹配,并返回剩余部分
${path##/*/返回long.file.name
${variable%pattern,如果pattern匹配变量结尾,删除最短匹配,并返回剩余部分
${path%.*}返回/home/tolstoy/mem/long.file
${variable%%pattern}如果pattern匹配变量结尾,删除最长匹配,并返回剩余部分
${pattern%%.*}返回/home/tolstoy/mem/long
返回字符串长度:
x=supercalifragilisticexpialidocious
echo ${#x}
3、特殊变量:
# 代表参数的个数
@ 命令行参数,"$@"扩展为原来单独的多个参数,要将原来的参数传递给另一个函数使用"$@"
* 命令行参数,"$*"扩展为一个参数
? 前一个命令的退出状态
$ shell进程的id
0 shell进程的名字
! 最后一个后台运行命令的进程id,可以使用它来保存该进程id,以便wait操作。
IFS 内部文本域的分割,通常为空格,tab或者换行
PS1 主命令行提示符,默认为$
PS2 行延续的提示符,默认为>
PS4 使用set -x提示符,默认为+
PWD 当前的工作目录
4、使用退出状态的if-else-fi
[code]
if grep "abc" file > /dev/null
then
echo "find abc in file"
else
echo "not find abc in file"
fi
[/code]
如果执行成功 exit状态为0,执行if,否则执行else
可以使用&
[code]
grep "abc" file >/dev/null &{
echo "find abc in file"
}
[/code]
5、break,continue可以带数字参数表示退出层数
[code]
while condition1 Outer loop
do ...
while condition2 Inner loop
do ...
break 2 Break out of outer loop
done
done
[/code]
6、sed
1)执行多个替换
[code]
sed 's;/home/tolstoy/;/home/lt/;'
[/code]
s后面可以指定分割:
比如:
[code]
sed 's/\/usr\/local\/bin/\/common\/bin/' <old >new
[/code]
可以通过指定|分割,把上面的命令变得更整洁:
[code]
sed 's|/usr/local/bin|/common/bin|' <old >new
[/code]
2)使用&
我们想在单词的两边加上括号
[code]
echo "hello 123" | sed 's/[a-z]*/(&)/' <old >new
[/code]
可以使用多次
[code]
echo "hello 123" | sed 's/[a-z]*/(&)(&)/' <old >new
[/code]
3)使用行数指定范围:
[code]
sed '1,100 s/A/a/'
sed '100,$ s/A/a/'
[/code]
4)使用d删除
[code]
sed -e 's/#.*//' -e '/^$/ d'
[/code]
上面代码用来删除空行和注释
5)使用p达到grep的功能
[code]
sed -n '/pattern/ p' #打印匹配行
sed -n '/pattern/ !p' </tmp/b #打印不匹配行
[/code]
6)使用 {}来group多个操作:
删除begin,end之间的空行和注释:
[code]
sed -n '
/begin/,/end/ {
s/#.*//
s/[ ^I]*$//
/^$/ d
p
}
'
[/code]
7)使用w来写入文件
比如把文件file中偶数找到,并放在even文件中:
[code]
sed -n 's/^[0-9]*[02468] /&/w even' <file
[/code]
sed参考http://www.grymoire.com/Unix/Sed.html