9 SHELL
9.2 命令
1.命令队列
- \
-
- 续行
- ;
-
- 命令之间分隔符
- CMD1 ; CMD2 ; CMD3…
- &
-
- 将命令放入后台执行
- CMD &
- &&
-
- 逻辑与
- CMD1 && CMD2
-
- CMD1执行成功,则执行CMD2
- CMD1执行失败,则不执行CMD2
- ||
-
- 逻辑或
- CMD1 || CMD2
-
- CMD1执行失败,则执行CMD2
- CMD1执行成功,则不执行CMD2
2.复合命令
-
循环结构
-
-
until循环
-
-
until 测试命令; do 命令块; done
-
[$n -gt 100]=n>100
-
lt 小于
-
gt 大于
-
le 小于等于
-
ge 大于等于
-
-
-
while循环
-
-
while 测试命令; do 命令块; done
-
例子
-
-
循环处理某一个文件的每一行内容
-
n=0
while read line; do
let n++
echo $line
done < /tmp/testecho $n
-
-
-
**推荐用第二种**
第一种:
| 进程间通信, 处在不同shell
shell|子shell
这时n为局部变量。
-
for循环
-
-
for (( 表达式一 ; 表达式二 ; 表达式三 )); do 命令块 ; done
-
for (( i=1; i<=100; i++ )); do 命令块 ; done
-
for 变量 [in 单词 ]; do 命令块; done
-
错误示范
-
-
测试命令
-
-
test([])
-
-
测试文件或值,用法:test EXPRESSION 或 [ EXPRESSION ]
-
文件测试
-
-
test -f FILE file,测试FILE是否是普通文件
-
test -d FILE directory,是否是目录
-
test -e FILE exist,是否存在
-
test –n 字符串 #字符串的长度非零 test –z 字符串 #字符串的长度是否为零
-
-
数值测试
-
- test integer1 -eq integer2 (equal)
- -gt (greater than)
- -lt (less than)
- -ge
- -le
- -ne
-
字符测试(字符加引号)
-
- “>”
- <
- =
- != 或 <>
- -z STRING 空
- -n STRING 非空
-
-
[[]]
-
- 数值测试
- 字符测试
-
-
-
判断结构
-
-
if 测试命令; then 命令块; fi
-
if 测试命令; then 命令块1 ; else 命令块2; fi
-
if 测试命令1; then 命令块1; elif 测试命令2; then 命令块2;… else 命令块3; fi
-
case选择结构
-
-
echo -n "请输入一个动物的名称: "
read ANIMAL
echo -n “$ANIMAL有”
case $ANIMAL in
马|狗|猫)
echo -n “四”
;;
人|袋鼠)
echo -n “两”
;;
*)
echo -n “未知数目的”
;;
esacecho “腿.”
-
-
-
命令组合
-
- ()
-
- 将()中的命令放入子shell中执行
- 举例
-
- for i in {1…254}; do (
ping -c1 -W1 172.16.199.$i > /dev/null 2>&1
if [ ? − e q 0 ] ; t h e n e c h o " 172.16.199. ? -eq 0 ]; then echo "172.16.199. ?−eq0];thenecho"172.16.199.i is alive"
else
echo “172.16.199.$i is dead”
fi
)
done
- for i in {1…254}; do (
- {}
-
- 将{}中的命令放入当前shell中执行
3.shell算术运算
- c=$[a+b]
- c=$((a+b))
- let c=a+b
- expr $a + $b
4.shell参数
- 位置参数
-
- $1,$2,$3等
- $@
-
- 所有参数,参数1 参数2 …
- $*
-
- “参数1 参数2 …”
- $?
-
- 上一个命令执行状态返回值
- $#
-
- 参数的个数
5.命令执行
- 简单命令扩展
- 命令的搜索路径
-
- PATH
- 执行环境
- 退出状态
- 信号
6.shell脚本
- 文件中命令的堆砌
- 创建shell脚本
-
- 创建以.sh结尾的文件
- shell脚本执行
-
- 通过脚本路径来执行
-
- 需要脚本具有x权限
- ./XX.sh
- /XX/YY/ZZ.sh
- bash FILENAME
-
- bash -x FILE 调试shell脚本
- 在子shell中执行,不需要文件由执行权限
- source FILENAME
-
- 在当前shell中执行在当前shell中执行
- 一般用于配置类型的shell脚本
7.shell函数
- 例子
-
格式
-
-
函数名(){函数体}
-
调用
-
- 函数名 【参数】…
-
9.3 SHELL脚本
9.3.1 常用的文本处理命令
1.文本查看
- cat
- more
- less
- head
- tail
- vi/vim/nano
2.文件搜索
1.find
- 用法: find PATH EXP
- EXP
-
- -name FILENAME
- -size SIZE
- -regex PATTERN 正则表达式匹配文件
- -print0 文件名输出到一行中
- -exec
-
- 对找到的文件调用其他命令处理
- find . -size -1k -exec ls -l {} ;
2.locate
- 根据索引查找文件,updatedb更新索引
- yum install mlocate
- locate FILENAME
3.文本处理
-
grep
- 正则表达式(Regular Expression)
-
-
定义
-
- RegularExpression
- 由普通字符和元字符组合的一种用来描述一种字符串的匹配的模式(pattern)
-
元字符(基本&扩展&perl)
-
- 基础元字符
-
- . #单个任意字符
- |(扩展),选择功能
- 次数
-
- “*” #前一个字符出现任意次
- ?(扩展) #前一个字符出现<=1次
- +(扩展) #前一个字符出现>=1次
- {n,m}(扩展) #前一个字符出现n到m次
-
- {5,}
- {,5}
- {5}
- 位置锚定
-
-
^ ^#,开头
-
$ #$,结尾
-
^$ 空白行
-
-
- "单词"边界
- - \ < "单词"左边界
- \ > "单词"右边界
- \b 配合-P选项连用
- echo "the there they" | grep "\bthe\b"
- 分组
-
- () 扩展元字符
-
- 将某些字符作为一个整体
- 分组(可以后向引用分组)
-
- \1
- 举例
-
- grep -E “^(.).*\1$” test
- []
-
-
字符组中任意一个字符
-
[:upper:]
-
PERL支持
-
- \d 等于 [0-9] 数字
- \D
- \s 空白字符(空格,制表符等)
- \S
- \w 英文字符(字母+数字+_)
- \W
-
-
‘abc+’ 和‘(abc)+’是不同的
-
语法
-
- grep [options] ‘PATTERN’ FILE
-
选项
2.cut
- 从文件的每一行截取一部分内容
- -d 分隔符delimiter
- -f 字段数field
- -c
-
- character字符位置
- -c7-
- -c7-10
- -c-10
3.sort
- 排序
- -t 分隔符
- -k 字段数
- -r 逆序
- -n 以数字大小排序
- -u 去重unique
4.uniq
- 去重之前先排序
- -c
-
- counting,统计重复次数
- 例子
-
- cut -d: -f7 /etc/passwd | sort | uniq -c | sort -n | tail -1 | awk ‘{print $2}’
5.wc
- word counting,单词,字符数,字节数,行数统计
- -l line
- -w 单词
- -m 字符数
- -c 字节数
6.tee
- 将上一个命令的输出结果重定向到文件并做标准输出
7.xargs
- 将上一个命令的输出每一行作为参数传递给xrags后面的命令
- 选项
-
- -d 指定分隔符
- -n 一次传几个参数
- -ISTR 使用符号替代需要传递的参数
- -t 显示执行命令
- 例子
-
- echo ‘/etc/fstab:/etc/inittab’ | xargs -t -d: -n1 -I{} cp -a {} /tmp
- find . -size -1k -print0 | xargs -0 ls -l
8.join
- 合并文件内容
- join test1 test2
- join -a1 test1 test2
- join -a2 test1 test2
- join -a2 -a1 test1 test2
- join -o 1.2 2.3 test1 test2
9.tr
- echo “abcdef” | tr a-z A-Z
- echo “abcdef” | tr -d abc