Shell 学习笔记

初识shell脚本

脚本文件xxx.sh

#!/bin/bash 指定bash解释器

#2018-3-18, by Karl 必要注释

#chkconfig: - 90 10 添加chkconfig参数添加为系统服务

#description: ,,,,
echo “,,,”输出提示信息

运行脚本文件的方法:

方法一:chmod +x xxx.sh; ./ xxx.sh
方法二:sh xxx.sh 用指定的命令解释器执行脚本
方法三:sourcexxx.sh 以当前默认的shell环境执行脚本

shell命令组合运用

管道操作

cmd1 | cmd2 将cmd1的输出交给cmd2
find /etc -name “*.conf” -type f | wc -l 统计行数
ps aux | grep httpd 查看进程中包含httpd的信息

重定向操作

重定向输入: < 从指定文件读取数据
重定向输出: > 输出结果覆盖到文件 >> 追加到文件
标准错误输出: 2> 2>> 错误信息覆盖/追加到文件
混合输出: &> &>> 将标准输出和错误信息覆盖/追加到文件
uname -r > version.txt 将系统版本信息保存到文件
cat xxx.txt 2> error.txt 将错误信息保存到文件

命令分隔

&& 与 || 或 ; 顺序执行
mkdir /a/b/c 2> /dev/null && echo “成功” 判断命令执行成功
mkdir /a/b/c 2> /dev/null || echo “失败” 判断命令执行失败
cd /boot/grub ; ls -lh grub.conf 顺序执行

使用变量

title = 1 ; echo $或/${a}
定界符:
双引号 允许引用变量,转义
单引号 禁止引用变量,转义
反撇号或$() 以命令输出进行替换
echo “$a”
echo ‘$a’
var=’uname -r’ ; echo $var
env 环境变量
脚本中系统或脚本复制的变量
$? 前一条命令执行的状态值 0为正常 非0异常
$0 脚本自身的程序名
$1-$9 第1到第9个位置参数
$* 命令行所有位置参数内容
$# 命令行的位置参数个数

1
2
3
4
5
#!/bin/bash
echo "本程序名: $0"
echo "执行时一共输入 $# 个位置参数"
echo "其中第一个参数时:$1"
echo "所有参数如下:$*"

数值运算及处理

整数运算

expr 1+1 ; expr 1*2 ; $X=1 ; $Y=2 ; expr $X+$Y
echo $[1+1] ; echo $[1*2] ; $X=1 ; $Y=2 ; echo $[X+Y]

几个数值处理技巧

变量递更处理 let X++ ; let Y – ; let X+=2
随机数 echo RANDOM 默认产生0-32767
生成数字序列 seq 首数 尾数, seq 首数 增量 尾数

小数运算技巧

echo “3.14*5” | bc
echo “scale=4 ; 10/3” | bc 约束小数位数

字符串处理

子串截取

路径分割 dirname basename
expr substr $var 起始位置 截取长度 编号从1开始
expr ${var:起始位置:截取长度} 编号从0开始
expr ${var::5} 从头开始截取5个

字符串替换

${var/old/new} 只替换第一个
${var//old/new} 替换所有old

随机字符串

随机字符->ASCII字符
head -1 /dev/urandom | md5sum
用cut切割字符串
echo $var | cut -b 起始位置-结束位置
head -1 /dev/urandom | md5sum | cut -b -8

条件测试

测试操作规范

test 条件表达式
[ 条件表达式 ] 注意表达式左右空格
[ -d “/etc” ] && echo YES 测试是否为目录

文件状态检测

-e: 目标是否存在
-d: 是否为目录
-f: 是否为文件
-r: 是否为可读取
-w: 是否可写入
-x: 是否可执行

整数值比较、字符串匹配

-eq: 等于
-ne: 不等
-gt: 大于
-lt: 小于
-ge: 大于或等于
-le: 小于或等于
= 字符串相同
!= 字符串不相同

if判断结构

程序流控制 for case if

单分支/双分支
if 条件 then 命令序列 fi
if 条件 then 命令序列 else 命令序列 fi

判断目标主机是否存活

1
2
3
4
5
6
7
8
#!/bin/bash
ping -c 3 -i 0.2 -W 3 $1 &> /dev/null
if [ $? -eq 0 ]
then
echo "Host $1 is up."
else
echo "Host $1 is down."
fi

多重分支

if ,,, then ,,, elif ,,, then ,,, else ,,, fi

判断分数

1
2
3
4
5
6
7
8
9
#!/bin/bash
read -p "请输入您的分数(0-100):" GRADE
if [ $GRADE -ge 85 ] && [ $GRADE -le 100 ] ; then
echo "$GRADE 分!优秀"
elif [ $GRADE -ge 60 ] && [ $GRADE -le 85 ] ; then
echo "$GRADE 分,合格"
else
echo "$GRADE 分?不合格"
fi

for循环

for 变量 in 取值列表
do 命令序列 done

输出当前目录

1
2
3
4
5
#!/bin/bash
for i in $(ls)
do
echo $i
done

ping ip

1
2
3
4
5
6
7
8
9
10
11
#!/bin/bash
IP_PRE="101.132.124.16"
for IP in $(seq 1 5)
do
ping -c 3 -i 0.2 -W 3 $IP_PRE$IP &> /dev/null
if [ $? -eq 0 ] ; then
echo "$IP_PRE$IP is up."
else
echo "$IP_PRE$IP is down."
fi
done

case分支

case 变量 in
case1)
xxx
;;
case2)
xxx
;;
*)
xxx
esac

识别输入字符类型

1
2
3
4
5
6
7
8
9
10
11
#!/bin/bash
read -p "请输入一个字符,并按Enter键确认:" KEY
case "$KEY" in [a-z]|[A-Z])
echo "您输入的是字母"
;;
[0-9])
echo "您输入的是数字"
;;
*)
echo "您输入的是空格、功能键或其他字符"
esac

后台进程启动与停止

1
2
3
4
5
6
7
8
9
10
11
#!/bin/bash
case "$1" in
start)
sleep 3600 &
;;
stop)
pkill -x "sleep"
;;
*)
echo "用法:$0 [start|stop]"
esac

非交互式处理方式

重定向、管道、命令替换
head,more,cut,tr
grep,awk,sed

awk文本处理工具

awk ‘模式 {操作}’ 文件
awk是逐行读取的
常用内建变量
NR 当前行号
FS 字段分隔 空格或tab
$n 当前行第n个字段
$0 当前行所有内容
awk ‘NR==1 {print}’ /etc/hosts
awk ‘NR==1,NR==3 {print}’ /etc/hosts 输出1到3行
awk ‘(NR==1)||(NR==3) {print}’ /etc/hosts输出1,3行
awk ‘(NR%2)==1 {print}’ /etc/hosts输出偶数行
awk ‘/正则表达式/ {print}’ /etc/hosts
awk -F. ‘$5==”xxx” {print $0}’ file.txt 满足以.分隔且第5字段为xxx条件的一行

sed文本处理工具

sed ‘编辑指令’ 文件
sed -n ‘编辑指令’ 文件 不输出指令未影响到的内容
sed -i ‘编辑指令’ 文件 可以更改原来的文件,不加i则不改
常用操作类型
p 输出/打印文本行
n 取下一行
d 删除
s 字符串替换
a 追加新文本
sed -n ‘p;n’ file.txt 输出奇数行
sed -n ‘n;p’ file.txt 输出偶数行
sed -n ‘/ne/!d’ file.txt 删除不包含ne的行

×

纯属好玩

扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

文章目录
  1. 1. 初识shell脚本
    1. 1.1. 脚本文件xxx.sh
    2. 1.2. 运行脚本文件的方法:
  2. 2. shell命令组合运用
    1. 2.1. 管道操作
    2. 2.2. 重定向操作
    3. 2.3. 命令分隔
  3. 3. 使用变量
  4. 4. 数值运算及处理
    1. 4.1. 整数运算
    2. 4.2. 几个数值处理技巧
    3. 4.3. 小数运算技巧
  5. 5. 字符串处理
    1. 5.1. 子串截取
    2. 5.2. 字符串替换
    3. 5.3. 随机字符串
  6. 6. 条件测试
    1. 6.1. 测试操作规范
    2. 6.2. 文件状态检测
    3. 6.3. 整数值比较、字符串匹配
  7. 7. if判断结构
    1. 7.1. 程序流控制 for case if
    2. 7.2. 判断目标主机是否存活
    3. 7.3. 多重分支
    4. 7.4. 判断分数
  8. 8. for循环
    1. 8.1. 输出当前目录
    2. 8.2. ping ip
  9. 9. case分支
    1. 9.1. 识别输入字符类型
    2. 9.2. 后台进程启动与停止
  10. 10. 非交互式处理方式
    1. 10.1. awk文本处理工具
    2. 10.2. sed文本处理工具