`

Bash札记(一)

阅读更多
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
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,continue可以带数字参数表示退出层数
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/' <old >new

可以通过指定|分割,把上面的命令变得更整洁:
sed 's|/usr/local/bin|/common/bin|' <old >new

2)使用&
我们想在单词的两边加上括号
    echo "hello 123" | sed 's/[a-z]*/(&)/' <old >new

可以使用多次
    echo "hello 123" | sed 's/[a-z]*/(&)(&)/' <old >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' </tmp/b #打印不匹配行

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' <file 

sed参考http://www.grymoire.com/Unix/Sed.html

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics