shell脚本基础5——常用命令写作技巧

news/2024/10/30 17:22:57/

文章目录

  • 一、grep命令
  • 二、sed命令
    • 2.1 选项参数
    • 2.2 常用命令
  • 三、AWK命令
    • 3.1 常用参数
    • 3.2 常用示例
  • 四、find与xargs
  • 五、date命令
  • 六、对话框
    • 6.1 消息框
    • 6.2 yes/no对话框
    • 6.3 表单输入框
    • 6.4 密码输入框
    • 6.5 菜单栏
    • 6.6 单选对话框
    • 6.7 多选对话框
    • 6.8 进度条
  • 七、常用写作技巧
    • 7.1 EOF写入
    • 7.2 定位脚本目录
    • 7.3 set参数
    • 7.4 wait命令
    • 7.5 docker类

一、grep命令

基本了解:

  • grep主要用于过滤文本数据。

grep匹配模式:

  • egrep支持扩展的正则表达式。
  • fgrep不需要转义,不支持正则
  • grep [options] regex [files] regex表示正则表达式
选项释义
-w不加-w,贪婪模式,只要有就显示
-o ‘pattern’仅显示匹配正则的字段
–color=auto以彩色方式显示关键字
-i忽略大小写
-v不匹配匹配的,反向选择
-l输出匹配的文件名
-L输出不匹配的文件名
-c输出匹配的数目(行数)
-n输出匹配行时在前面加上文件名及在其中的行数
-x匹配整行
-A nu输出匹配到的当前行及后nu行
-B nu输出匹配到的当前行及前nu行
-C nu输出匹配到的当前行及前后nu行
-E支持扩展的正则表达式
-F不支持正则表达式,即不需要转义
-h抑制文件名的输出
-s抑制类似找不到文件等错误信息
-a针对二进制文件使用

二、sed命令

基本了解:

  • SED工具用来对文本进行过滤与替换操作,特别是在用脚本处理配置文件。
  • sed的模式空间:sed通过文件或管道读取文件内容,并将读入的内容复制到缓冲区中的过程。默认情况下,sed并不直接修改源文件,而是直接在对缓冲区中的内容进行操作。除非用sed -i这个功能,才能直接修改原文件内容。

2.1 选项参数

选项释义示例
-n一般sed的用法中,所有来自 STDIN的资料一般都会被列出到屏幕上。
但如果加上 -n 后,则只有sed 特殊处理的那一行(或者动作)才会被列出来。
常与参数p配合使用。
sed -n “s#a#t#gp” 1.txt
替换1.txt中所有a为t
-e直接在指令列模式上进行 sed 的动作编辑sed -e ‘s/999/777/g’ baimu.sh
-f直接将 sed 的动作写在一个文件内
-rsed 的动作支援的是延伸型正规表示法的语法(预设基础正规表示法语法)
-i直接修改读取的文件内容,而不是由屏幕输出sed -i ‘s/999/888/g’ baimu.sh

1.参数-e用法示例。
在这里插入图片描述
2.参数-i用法示例。
在这里插入图片描述
3.参数-n用法示例,配合p使用。
在这里插入图片描述

2.2 常用命令

sed常用命令语法:

  • sed 【选项参数】 ‘命令’ 【文件名】
命令释义
a\新增append ,a 后面可以接字串,而这些字串会新的在目前的下一行出现。
i\插入, i 后面可以接字串,而这些字串会新的在目前的上一行出现。
d删除,因为是删除,所以 d 后面通常不接任何
c\整行取代。
s\取代(查找并替换),通常这个 s 的动作可以搭配正规表示法
p打印(显示),亦即将某个选择的资料印出,通常与参数 sed -n一起

1.新增。在显示结果的第2行下添加内容000。

在这里插入图片描述
2.插入。在显示结果的第2行上添加内容88888。
在这里插入图片描述
3.删除。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
4.整行取代。

在这里插入图片描述
在这里插入图片描述
5.查找字符取代。
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
5.去掉空白行。
在这里插入图片描述

6.多命令组合使用时,可以使用多个-e指定。
在这里插入图片描述

三、AWK命令

基本了解:

  • AWK工具:是一种处理结构数据并输出格式化结果的编程语言。
  • 通常被用来进行格式扫描和处理。通过扫描一个或多个文件中的行,查看是否匹配指定的正则表达式,并执行相关的操作。

awk的主要特性:

  1. Awk以记录(文件中的行)和字段(文件中的列)的方式来查看文本文件。
  2. 和其他编程语言一样,Awk 包含变量、条件和循环。
  3. Awk能够进行运算和字符串操作。
  4. Awk能够生成格式化的报表数据。
  5. Awk 读入一行,执行一次主输入循环。

awk语法:

  • awk ‘/search pattern1/ {Actions}’
  • awk ‘/查找匹配/ {动作}’ 输入文件名

3.1 常用参数

参数释义
-F指定默认输入字段分割符,当不使用-F时,默认以“空格”即\t作为分割符。
-V指定默认输入记录分割符,当不使用-F时,默认以“回车”即\n作为分割符。
print非格式化打印 只能打印字符串和变量。
字符串必须加引号,$0、$1等默认变量不能加引号,自定义的变量要加’ '单引号

1.使用-F指定\作为分隔符。
在这里插入图片描述
2.显示文件内容,并添加行号。

在这里插入图片描述

3.2 常用示例

1.显示所有内容。
在这里插入图片描述

2.显示第1列和第2列
在这里插入图片描述
3.带行号显示第1列和第2列
在这里插入图片描述
4.显示第1列和最后一列
在这里插入图片描述
5.显示第1行和第5行。
在这里插入图片描述
6.显示第1行到第5行。
在这里插入图片描述

四、find与xargs

  • 这两个命令常常搭配来用,可以查找并及时处理内容。

固定格式:

  • |xargs -I {} 命令 {}
  • {}代表上个命令返回的每个结果。

1.例1,查找/opt目录名称为setup.sh的文件,交给xargs处理,打印第2行到第4行的内容。
在这里插入图片描述

五、date命令

  • 需要对时间日期操作时,使用date。
  • 常用于数据压缩脚本,日志脚本。

1.读取当前年月日,time= `date +%Y%m%d`
在这里插入图片描述

2.以指定格式获取3个月以前的年月日,old_time=`date -d “$now 3 months ago” +%Y.%m.%d`

在这里插入图片描述
3.单独获取年月日,如下获取一天以前的日期,`date -d “$now 1 days ago” +%m%d`

在这里插入图片描述
4.脚本中也可以使用小括号引用变量,作用和单引号一样,time=$(date +%Y.%m.%d-%H.%M.%S)

在这里插入图片描述

六、对话框

  • 脚本中若是需要与用户交互,可以使用该对话框处理。比如安装服务时需要用户选择安装什么服务,此时可以考虑做个对话框出来供用户选择。
  • 实现对话框的工具有多种,比如dialog,zenity,它俩需要安装。这里讲whiptail的用法,,它是默认安装的。

6.1 消息框

语法:

  • whiptail --title “< message box title>” --msgbox “< text to show>” < height> < width>

参数释义:

  • 参数title:文本框的标头。
  • 参数msgbox:文本框中要显示的内容。
  • 参数 < height> :文本框的高度。
  • 参数< width>: 文本框的长度。

1.安装服务时,可以在脚本中设计这一行,让用户确认自己的选择。

[root@localhost ~]# cat baimu.sh 
#!/bin/bash
whiptail --title "请确认你要安装的微服务" --msgbox "qingjun" 10 60

2.执行脚本。

在这里插入图片描述

6.2 yes/no对话框

语法:

  • whiptail --title “< dialog box title>” --yesno “< text to show>” < height> < width>
  • 当选择左边选项的时候输出的是0,选择右边选项的时候输出的是1。

参数释义:

  • 参数title:文本框的标头。
  • 参数yesno:文本框中要显示的内容。
  • 参数 < height> :文本框的高度。
  • 参数< width>: 文本框的长度。
  • 参数–yes-button:选择yes的按钮显示。
  • 参数–no-button:选择no的按钮显示。

1.当有判断选择项时,可以选择安装,也可以选择不安装,此时可以使用yes/no对话框。

[root@localhost ~]# cat baimu.sh 
#!/bin/bash
if (whiptail --title "请选择Yes或No" --yesno "是否要安装qingjun服务." 10 60);thenecho "你选择的是yes,即将安装"
elseecho "你选择的是no,不安装"
fi

在这里插入图片描述

2.也可以自定义选择项。

[root@localhost ~]# cat baimu.sh 
#!/bin/bash
if (whiptail --title "请选择Yes或No" --yes-button "男" --no-button "女"  --yesno "你的性别是什么?" 10 60) thenecho "You chose Man Exit status was $?."
elseecho "You chose Woman. Exit status was $?."
fi

在这里插入图片描述

6.3 表单输入框

语法:

  • whiptail --title “< input box title>” --inputbox “< text to show>” < height> < width> < default-text>

参数释义:

  • 参数title:文本框的标头。
  • 参数 < height> :文本框的高度。
  • 参数< width>: 文本框的长度。
  • 参数inputbox:适用与用户交互,让用户输入内容。

1.当要安装集群服务时,可以使用表单输入框来实现。

[root@localhost ~]# cat baimu.sh 
#!/bin/bash
NAME=$(whiptail --title "服务安装" --inputbox "请输入要安装服务的服务器IP" 10 60  3>&1 1>&2 2>&3)exitstatus=$?
if [ $exitstatus = 0 ]; thenecho "Your name is:" $NAME
elseecho "You chose Cancel."
fi

2.执行脚本
在这里插入图片描述

6.4 密码输入框

语法:

  • whiptail --title “< password box title>” --passwordbox “< text to show>” < height> < width>

参数释义:

  • 参数title:文本框的标头。
  • 参数 < height> :文本框的高度。
  • 参数< width>: 文本框的长度。
  • 参数passwordbox:适用与用户交互,让用户输入密码。

1.当涉及到密码校验时,可以选择密码输入框。

[root@localhost ~]# cat baimu.sh 
#!/bin/bash
PASSWORD=$(whiptail --title "密码校验" --passwordbox "请输入密码:" 10 60 3>&1 1>&2 2>&3)exitstatus=$?
if [ $exitstatus = 0 ]; thenecho "Your password is:" $PASSWORD
elseecho "You chose Cancel."
fi

2.执行脚本
在这里插入图片描述

6.5 菜单栏

基本了解:

  • 提供一个单项选择的菜单栏。

语法:

  • whiptail --title “< menu title>” --menu “< text to show>” < height> < width> < menu height> [ < tag> < item> ] . . .

参数释义:

  • 参数title:文本框的标头。
  • 参数 < height> :文本框的高度。
  • 参数< width>: 文本框的长度。
  • 参数menu:适用与用户交互,供用户选择。

1.可以提供选择项,常用于总脚本,提供各个小脚本执行选择。

[root@localhost ~]# cat baimu.sh 
#!/bin/bash
OPTION=$(whiptail --title "服务安装" --menu "请选择要安装的微服务" 15 60 4 \
"第一步" "系统初始化" \
"第二步" "安装consul服务端" \
"第三步" "安装consul客户端"   3>&1 1>&2 2>&3)exitstatus=$?
if [ $exitstatus = 0 ]; thenecho "Your favorite programming language is:" $OPTION
elseecho "You chose Cancel."
fi

2.执行脚本。
在这里插入图片描述

6.6 单选对话框

基本了解:

  • 该对话框是单选对话框,可以控制默认的选择位置,即使你在脚本中默认选择多个,他也只会输出一个结果。

语法:

  • whiptail --title “< radiolist title>” --radiolist “< text to show>” < height> < width> < list height> [ < tag> < item> < status> ] . . .

参数释义:

  • 参数title:文本框的标头。
  • 参数 < height> :文本框的高度。
  • 参数< width>: 文本框的长度。
  • 参数radiolist:适用与用户交互,供用户选择,单选。在脚本中可以通过OFF/ON选择默认项。

1.可以根据安装服务类别来选择。

[root@localhost ~]# cat baimu.sh 
#!/bin/bash
DISTROS=$(whiptail --title "服务安装" --radiolist \
"单选,请选择你要安装的微服务" 15 60 4 \
"aaa" "服务1" OFF \
"bbb" "服务2" OFF \
"ccc" "服务3" OFF \
"ddd" "服务4" OFF 3>&1 1>&2 2>&3)exitstatus=$?
if [ $exitstatus = 0 ]; thenecho "The chosen distro is:" $DISTROS
elseecho "You chose Cancel."
fi

2.执行脚本,空格选择。
在这里插入图片描述

6.7 多选对话框

语法:

  • whiptail --title “< checklist title>” --checklist “< text to show>” < height> < width> < list height> [ < tag> < item> < status> ] . . .

参数释义:

  • 参数title:文本框的标头。
  • 参数 < height> :文本框的高度。
  • 参数< width>: 文本框的长度。
  • 参数checklist:适用与用户交互,供用户选择,多选。在脚本中可以通过OFF/ON选择默认项。

1.适用一次性安装多个服务。

[root@localhost ~]# cat baimu.sh 
#!/bin/bash
DISTROS=$(whiptail --title "服务安装" --checklist \
"多选,请选择要安装的服务:" 15 60 4 \
"aaa" "服务1" ON \
"bbb" "服务2" OFF \
"ccc" "服务3" ON \
"ddd" "服务4" OFF 3>&1 1>&2 2>&3)exitstatus=$?
if [ $exitstatus = 0 ]; thenecho "Your favorite distros are:" $DISTROS
elseecho "You chose Cancel."
fi

2.执行脚本。
在这里插入图片描述

6.8 进度条

语法:

  • whiptail --gauge “< test to show>” < height> < width> < inital percent>

参数释义:

  • 参数title:文本框的标头。
  • 参数 < height> :文本框的高度。
  • 参数< width>: 文本框的长度。

1.适用大服务脚本安装进度,不常用。

[root@localhost ~]# cat baimu.sh 
#!/bin/bash
{for ((i = 0 ; i <= 100 ; i+=1)); dosleep 1echo $idone
} | whiptail --gauge "Please wait while installing" 6 60 0

2.执行脚本。
在这里插入图片描述

七、常用写作技巧

7.1 EOF写入

  • 若需要在脚本中往指定文件里面写入内容,可以使用EOF一次性写入。

格式:

cat >文件名 <<EOF
文本内容
EOF

1.示例。

cat >docker-compose.yml <<EOF
version: '3'
services:${app_container}:container_name: ${app_container}image: "reg.citms.cn:7443/public/${app_name}:${app_version}"hostname: "${app_container}"restart: alwaysports: - "${app_ports[0]}:${app_ports[0]}" volumes:- /etc/localtime:/etc/localtime:ro- ./data:/var/lib/mysql- ./config:/etc/mysql/conf.denvironment: - MYSQL_ROOT_PASSWORD=${app_password}
EOF

7.2 定位脚本目录

  • 写脚本时,需要确定脚本存放位置。
  • 比如脚本实际位置为/opt/test/qingjun.sh,此时不论是在/opt/test/目录下 sh qingjun.sh,还是在其他目录,如/tmp目录下sh /opt/test/qingjun.sh,都会打印出/opt/test

1.可以在脚本开头将脚本目录定义为变量,不管在那个目录执行脚本时都会寻找该目录,不会因为找不到脚本报错。

#!/bin/bashscriptDir=$(cd $(dirname $0); pwd)
echo ${scriptDir};

7.3 set参数

  • 有几个参数很常用。

1.set -x:会在执行每一行shell脚本时,把执行的内容输出来,一般只用于调试使用。

set -x
command1
command2
set +x
command3

2.set -e:会在执行过程中,只要发生错误,脚本就终止执行,防止命令关联故障。

#中途也可以设置某些步骤即使报错也继续往下进行
set +e
command1
command2
set -e
command3

3.set +o history会临时消除history记录,用于隐藏敏感信息,常用于密码类

# 查看历史记录,会发现只有export YYY2=123,没有export YYY1=123
set +o history
export YYY1=123
set -o history
export YYY2=123

7.4 wait命令

  • wait命令配合&使用可以执行多条命令。
  • shell脚本中的任务通常是顺序执行,当需要同时执行多条命令时,可以采用wait命令。

1.通过 & 让进程后台执行,wait会等待shell中之前的进程结束

#!/bin/bash
mysleep() {echo "sleep $1 seconds"sleep "$1"
}
main() {for ((i = 1; i < 10; i++)); do(mysleep $i) &donewait
}
time main

在这里插入图片描述

7.5 docker类

  • 企业中,常用dokcer打包安装服务,所以在写计划任务时,需要注意计划任务执行时候没有TTY,否则计划任务日志会报错:the input device is not a TTY。
  • 比如计划任务中存在数据库数据备份脚本,那么该脚本中肯定会有docker exec -it myslq -u …这种命令,此时需要把-t参数去掉。
  • 计划任务的执行情况,通常查看 /var/spool/mail/root。

http://www.ppmy.cn/news/332852.html

相关文章

做副业的我很迷茫,但ChatGPT却治好了我——AI从业者被AI模型治愈的故事

迷茫&#xff0c;无非就是不知道自己要做什么&#xff0c;没有目标&#xff0c;没有方向。 当有一个明确的目标时&#xff0c;往往干劲十足。但做副业过程中&#xff0c;最大的问题往往就是 不知道自己该干什么。 干什么&#xff1f;怎么干&#xff1f;干到什么程度&#xff1f…

sm2,sm4加密(js+java)

一、使用 做项目时&#xff0c;首先采用了sm2数据传输加密&#xff0c;随后又改为sm4&#xff0c;此处使用仅为个人愚见&#xff0c;望与诸君共勉。 sm2,非对称加密&#xff0c;在后端生成两对秘钥&#xff0c;私钥A,公钥A,私钥B,公钥B。前端持有公钥A,私钥B&#xff0c;后端持…

锤子手机权限开启方法

图片中的软件名称只是举例&#xff0c;请对应设置你使用中的软件

javascript实现SM2加密解密

前提JavaWeb环境 前端代码 window.sm2 function (t) {function i(e) {if (r[e]) return r[e].exports;var n r[e] {i: e, l: !1, exports: {}};return t[e].call(n.exports, n, n.exports, i), n.l !0, n.exports}var r {};return i.m t, i.c r, i.d function (t, r,…

国密sm2加密算法 前后端加密实现

先看前端&#xff0c; 需要两个js目录如下&#xff0c;最下面把文件内容放出来 index.html文件内容如下 <!DOCTYPE html> <html> <head><meta charset"utf-8"><title>SM2-TEST</title><script src"crypto-js.js"…

js 使用sm2 国密加密

js 使用sm2 国密加密 由于项目中要对数据进行国密加密 注意&#xff1a; 同一个明文&#xff0c;加密后的密文都不同&#xff0c;解密的话要用私钥解密 js用sm2加密&#xff0c;首先要从后端获取公钥&#xff0c;用公钥加密 参考资料 crypto-js.js !function(t,r){"o…

百万级分布式爬虫

#要爬取的url url_l [] #请求头 MY_USER_AGENT ["Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; AcooBrowser; .NET CLR 1.1.4322; .NET CLR 2.0.50727)","Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; Acoo Browser; SLCC1; .NET CLR 2.…

免费IP代理池定时维护,封装通用爬虫工具类每次随机更新IP代理池跟UserAgent池,并制作简易流量爬虫...

前言 我们之前的爬虫都是模拟成浏览器后直接爬取&#xff0c;并没有动态设置IP代理以及UserAgent标识&#xff0c;这样很容易被服务器封IP&#xff0c;因此需要设置IP代理&#xff0c;但又不想花钱买&#xff0c;网上有免费IP代理&#xff0c;但大多都数都是不可用&#xff0c;…