shell脚本使用教程2

shell脚本使用教程2

一.shell函数与数组
1.函数
格式
func () {
command
}
2.数组

获取所有元素:
# echo ${array[*]} # *和@ 都是代表所有元素
a b c
获取元素下标:
# echo ${!a[@]}
0 1 2
获取数组长度:
# echo ${#array[*]}
3
获取第一个元素:
# echo ${array[0]}
a
获取第二个元素:
# echo ${array[1]}
b
获取第三个元素:
# echo ${array[2]}
c
添加元素:
# array[3]=d
# echo ${array[*]}
a b c d
添加多个元素:
# array+=(e f g)
# echo ${array[*]}
a b c d e f g
删除第一个元素:
# unset array[0] # 删除会保留元素下标
# echo ${array[*]}
b c d e f g
删除数组:
# unset array

实例一.遍历数组元素

方法 1:
#!/bin/bash
IP=(192.168.1.1 192.168.1.2 192.168.1.3)
for ((i=0;i<${#IP[*]};i++)); do
echo ${IP[$i]}
done
# bash test.sh
192.168.1.1
192.168.1.2
192.168.1.3
方法 2#!/bin/bash
IP=(192.168.1.1 192.168.1.2 192.168.1.3)
for IP in ${IP[*]}; do
echo $IP
done

二.shell文本处理
1.grep
1.1 匹配开头不分大小写的单词(-i 不区分大小写)

echo "A a b c" |xargs -n1 |grep -i a
echo "A a b c" |xargs -n1 |grep '[Aa]'
A a

1.2 递归搜索/etc目录下包含ip的conf后缀文件 (-r 递归目录)
其中–include = FILE_PATTERN 只检索匹配的文件
–exclude = FILE_PATTERN 跳过匹配的文件
–exclude-from = FILE 跳过匹配的文件,来自文件模式
–exclude-dir = PATTERN 跳过匹配的目录

# grep -r '192.167.1.1' /etc --include *.conf

1.3 排除搜索bak后缀的文件

# grep -r '192.167.1.1' /opt --exclude *.bak

1.4 排除来自file中的文件

# grep -r '192.167.1.1' /opt --exclude-from file

1.5 匹配所有IP

# ifconfig |grep -E -o "[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}

1.6 -B, --before-context=NUM 打印匹配的前几行
-A, --after-context=NUM 打印匹配的后几行
-C, --context=NUM 打印匹配的前后几行

# seq 1 10 |grep 5 -A 3

三.shell标准输入,输出和错误
1.重定向输入
一般格式:[n] < word
如果n没有指定,默认是0
实例一.a.txt内容作为grep输入

# grep "test" --color < a.txt

2.重定向标准输出和标准错误
2.1 覆盖重定向标准输出和标准错误
& > word 和 >& word等价于 >word 2 >&1
&将标准输出和标准输入绑定到一起,重定向word文件。

当不确定执行对错时都覆盖到文件:
# echo "1 + 1" |bc &> error.log
当不确定执行对错时都覆盖到文件:
# echo "1 + 1" |bc > error.log 2>&1

2.2 追加重定向标准输出和标准错误

&>>word 等价于>>word 2>&1

实例

当不确定执行对错时都追加文件:
# echo "1 + 1" |bc &>> error.log

3 重定向到空设备

通过重定向到/dev/null 忽略输出,比如我们没有安装 bc 计算器,正常会抛出没有发现命令:
# echo "1 + 1" |bc >/dev/null 2>&1
这就让标准和错误输出到了空设备。
忽略标准输出:
# echo "test" >/dev/null
忽略错误输出:
# echo "1 + 1" |bc 2>/dev/null

四.Linux信号类型
1.linux支持的信号
在这里插入图片描述
在这里插入图片描述
CoreDump(核心转储):当程序运行过程中异常退出时,内核把当前程序在内存状况存储在一个core 文件中,以便调试。 执行命令 ulimit -c 如果是 0 则没有开启, 也不会生成 core dump 文件,可通过 ulimit -c unlimited 命令临时开启 core dump 功能, 只对当前终端环境有效,如果想永久生效,可修改/etc/security/limites.conf 文件,添加一行 “* soft core unlimited” 默认生成的 core 文件保存在可执行文件所在的目录下,文件名为 core。 如果想修改 core 文件保存路径,可通过修改内核参数: echo “/tmp/corefile-%e-%p-%t” > /proc/sys/kernel/core_pattern
则文件名格式为 core-命名名-pid-时间戳。

2.trap命令
trap命令定义shell脚本在运行时根据接收到的信号做相应的处理
命令格式: trap [-lp] [[arg] signal_spec …]
-l # 打印编号 1-64 编号信号名称
arg # 捕获信号后执行的命令或者函数
signal_spec # 信号名或编号
一般捕捉信号后,做以下几个动作:
1)清除临时文件
2)忽略该信号
3)询问用户是否终止脚本执行
实例一.按ctrl+c不退出循环

#!/bin/bash
trap "" 2 # 不指定 arg 就不做任何操作,后面也可以写多个信号,以空格分隔
for i in {1..10}; do
	echo $i
	sleep 1
done

实例二.循环打印数字,按ctrl+退出,并打印退出提示

#!/bin/bash
trap "echo 'exit...';exit" 2
for i in {1..10}; do
	echo $i
	sleep 1
done

实例三.让用户选择是否终止循环

#!/bin/bash
trap "func" 2
func() {
	read -p "Terminate the process? (Y/N): " input
	if [ $input == "Y" ]; then
		exit
	fi
}
for i in {1..10}; do
	echo $i
	sleep 1
done

五.shell编程时常用的系统文件
1.环境变量文件

开启启动脚本顺序: /etc/profile -> /etc/profile.d/*.sh -> ~/.bash_profile -> ~/.bashrc ->
/etc/bashrc

六.shell常用命令与工具
1.echo
功能:打印一行
常用选项:
-n 不加换行符
-e 解释转义符
解释换行符

# echo -e "1\n2\n3"
1 
2
3

2.wc
统计文件行数,字节数,字符数
常用选项
-l 打印多少行

统计文件多少行:
# wc -l file

3.dirname
去除路径的最后一个名字

# dirname /usr/bin//usr
# dirname dir1/str dir2/str
dir1
dir2
# dirname stdio.h

4.cut
选取文件的每一行数据
常用选项
-b 选中第几个字符
-c 选中多少个字符
-d 指定分隔符分字段,默认是空格
-f 显示选中字段

打印 b 字符:
# echo "abc" |cut -b "2"
b
截取 abc 字符:
# echo "abcdef" |cut -c 1-3
abc
以冒号分隔,显示第二个字段:
# echo "a:b:c" |cut -d: -f2
b

5.find
搜索文件目录层次结构
格式:find path -option actions

6.xargs
从标准输入执行命令
-a file 从指定文件读取数据作为标准输入-0 处理包含空格的文件名,print0
-d delimiter 分隔符,默认是空格分隔显示
-i 标准输入的结果以{}代替
-I 标准输入的结果以指定的名字代替
-t 显示执行命令
-p 交互式提示是否执行命令
-n 最大命令行参数
–show-limits 查看系统命令行长度限制

删除/tmp 下名字是 core 的文件:
# find /tmp -name core -type f -print | xargs /bin/rm -f
# find /tmp -name core -type f -print0 | xargs -0 /bin/rm -f
列转行(去除换行符 ):
# cut -d: -f1 < /etc/passwd | sort | xargs echo
行转列:
# echo "1 2 3 4 5" |xargs -n1
最长两列显示:
# echo "1 2 3 4 5" |xargs -n2
创建未来十天时间:
# seq 1 10 |xargs -i date -d "{} days " +%Y-%m-%d
复制多个目录:
# echo dir1 dir2 |xargs -n1 cp a.txt
清空所有日志:
# find ./ -name "*.log" |xargs -i tee {} # echo ""> {} 这样不行, >把命令中断了
rm 在删除大量的文件时,会提示参数过长,那么可以使用 xargs 删除:
# ls |xargs rm – rf
或分配删除 rm [a-n]* -rf # getconf ARG_MAX 获取系统最大参数限制

7.wget
下载单个文件到当前目录:

# wget http://nginx.org/download/nginx-1.11.7.tar.gz
放到后台下载:
# wget -b http://nginx.org/download/nginx-1.11.7.tar.gz
对于网络不稳定的用户使用-c 和--tries 参数,保证下载完成,并下载到指定目录:
# wget -t 3 -c http://nginx.org/download/nginx-1.11.7.tar.gz -P down
不下载任何内容,判断 URL 是否可以访问:
# wget --spider http://nginx.org/download/nginx-1.11.7.tar.gz
下载内容写到文件:
# wget http://www.baidu.com/index.html -O index.html
从文件中读取 URL 下载:
# wget -i url.list
下载 ftp 文件:
# wget --ftp-user=admin --ftp-password=admin ftp://192.168.1.10/ISO/CentOS-6.5-i386-
minimal.iso伪装客户端,指定 user-agent 和 referer 下载:
# wget -U "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko)
Chrome/44.0.2403.157 Safari/537.36" --referer "http://nginx.org/en/download.html"
http://nginx.org/download/nginx-1.11.7.tar.gz
查看 HTTP 头信息:
# wget -S http://nginx.org/download/nginx-1.11.7.tar.gz
# wget --debug http://nginx.org/download/nginx-1.11.7.tar.gz

8.curl

访问 HTTP 认证页面:
# curl -u user:pass http://www.example.com
FTP 上传文件:
# curl -T filename ftp://user:pass@ip/a.txt
# curl ftp://ip -u user:pass-T filename
FTP 下载文件:
# curl -O ftp://user:pass@ip/a.txt
# curl ftp://ip/filename -u user:pass -o filename
FTP 下载多个文件:
# curl ftp://ip/img/[1,3,5].jpg
查看 HTTP 头信息:
# curl -I http://www.baidu.com

9.netstat
功能: 打印网络连接、路由表、接口统计信息、伪装连接和多播成员
常用选项:-r 显示路由表
-i 显示接口表
-n 不解析名字
-p 显示程序名 PID/Program
-l 显示监听的 socket
-a 显示所有 socket
-o 显示计时器
-Z 显示上下文
-t 只显示 tcp 连接
-u 只显示 udp 连接
-s 显示每个协议统计信息

显示所有监听:
# netstat -anltu
显示所有 TCP 连接:
# netstat -antp
显示所有 UDP 连接:
# netstat -anup
显示路由表:
# netstat -r

10.time

下面来说一下 sleep 和 usleep 的区别:
sleep : 默认以秒为单位。
usleep : 默认以微秒为单位。
1s = 1000ms = 1000000us
sleep 不但可以用秒为单位,还可以指定延迟的单位,例如:
sleep 1s 表示延迟一秒
sleep 1m 表示延迟一分钟
sleep 1h 表示延迟一小时
sleep 1d 表示延迟一天
有时 usleep 不能用;可以用下面格式延时:
sleep 0.01  //  10ms
sleep 0.1    //   100ms
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值