最近在梳理知识,整理一下shell。
一、 基本语法
1.1 注释
输出帮助性文字 (EOF为边界区分字符串随意定义)
cat <<EOF
帮助性文字区域
EOF
以#开头的句子表示注释
Usage 示例
if [ $# -lt 3 ]; then
# 如果少于三个参数则显示使用的信息,然后退出。
echo "Usage: `basename $0`arg1 arg2 arg3" >&2
exit 1
fi
1.2 特殊变量
变量 含义
$0 包含当前 脚本全路径的特殊变量
$1 -$9 位置参数1-9
${10} 位置参数10
$# 位置参数的个数
"$*" 所有位置参数(作为单个字符串,被双引号引住)
"$@" 所有位置参数都分别被双引号引住
${#*} 传递到脚本中的命令行参数的个数
${#*} 传递到脚本中的命令行参数的个数
$? 前一个命令执行后的退出状态返回值
$$ 当前脚本进程的PID
$- 传递到脚本中的标识
$_ 之前命令的最后一个参数
$! 运行在后台的最后一个作业的进程ID(PID)。
注意点:linux shell 中这两个$* $@区别
相同点:都是引用所有参数
不同点:只在双引号中体现出来
假设你的脚本运行时你写了三个参数 分别存储在$1 $2 $3中
则"$*" 等价于 “$1 $2 $3" ---》传递了一个参数
而“$@" 等价于 "$1" "$2" "$3" ---》传递了三个参数
1.3 变量基础知识
变量基础1.4测试操作
1.4.1算术比较操作符
-eq(等于) -ne(不等于) -lt或<(小于) -le或<=(小于等于) -gt或>(大于) -ge(大于等于)
1.4.2字符串比较操作符
= ,==,!=,<,>,-z(字符串为空),-n(字符串不为空)
1.4.3参数替换和扩展
${ : }带冒号的表达式
${var:-DEF} 若var没被声明或值为null, 整个参数替换表达式为DEF
${var:=DEF} 若var没被声明或值为null, 整个参数替换表达式为DEF,且var的值为DEF
${var:+OTHER} 如果var被设置了, 整个参数替换表达值为OTHER, 否则为null字符串
${var:?ERR_MSG} 如果var没被设置, 那就打印$ERR_MSG
表达式 含义
${var_DEFAULT} 如果var没被声明, 就以$DEFAULT作为其值 *
${var=DEFAULT} 如果var没被声明, 就以$DEFAULT作为其值 *
${var+OTHER} 如果var声明了, 其值就是$OTHER, 否则为null字符串
${var?ERR_MSG} 如果var没被声明, 那就打印$ERR_MSG*
${! }带!的表达式
${!varprefix*} ${!varprefix@} 将带有前缀varprefix的参数名打印出来
${!arg[*]} 打印arg数据组的下标
${ }带正则匹配的表达式
${var#word} #最短匹配
${var##word} ##最长匹配
从头开始扫描word,将匹配word正则表达式的字符过虑掉
${var%word} %最短匹配
${var%%word} %%最长匹配
从尾开始扫描word,将匹配word正则表达式的字符过滤掉
1.5 常用的命令
1.5.1标准输入/输出/错误
0——stdin(标准输入)
1——stdout(标准输出)
2——stderr(标准错误)
<输入重定向 —— 将<右侧信息做为左侧的输入信息
>输出重定向 —— 将>左侧信息输出至右侧文件中
/dev/null 无底洞
“2>/dev/null” 代表忽略掉错误提示信息
>/dev/null 2>&1 标准输出和标准错误都重定向到/dev/null
2>&1>/dev/null 标准错误打印到屏幕,而标准输出不打印到屏幕
&>/dev/null 通通重定向到/dev/null
1.5.2 常用命令
获取文件名和路径
basename path 从path中分离出文件名
示例 echo "Usage:`basename $0` give me a file"
dirname path 返回文件所在路径
script option file 在当前会话中输入此命令,退出会话时,将输入记录下并附加到指定文件的末尾
替换
tr [options] [source-char-list] [replace-char-list] < filename
将replace-char-list的值替换source-char-list中相应位置中的值,并输出到屏幕中,filename文件不改变内容
[replace-char-list]专用的设定
[char*] 重复指定的字符到source-char-list相同长度为止
[char*rep]将char重复rep次数
source-char-list > replace-char-list时,source多出来的字符都会和replace中最后一个字符相对应
source-char-list < replace-char-list时,replace中多余的部分被抛弃。
[source-char-list]专用的设定
-s 有连续的source-char-list里的字符时,缩减为1个。
查找与替换
find
grep 查找文本
sed 查找与替换
注意sed是以行对输入进行处理;处理的不是原文件而是原文件的拷贝
1.6正则表达式
基础正则表达式BRE
扩展正则表达式ERE
网友评论