把昨天的续上
五、变量置换
命令替换
a=`date +%m%d` a=$(date +%m%d) 反引号亦可用$() 代替
变量替换
一 ${parameter:-word} 若 parameter 为空或未设置,则用 word 代替 parameter 进行替换,parameter 的值不变 # a=1 # unset b # a=${b:-3} # echo $a 3 # echo $b # 若 parameter 不为空,则不替换,parameter 的值不变 # unset b # # a=1 # b=2 # a=${b:-3} # echo $a 2 # echo $b 2 # 二 ${parameter:=word} 若 parameter 为空或未设置,则用 word 代替 parameter 进行替换,parameter 的值改变 # a=1 # unset b # a=${b:=3} # echo $a 3 # echo $b 3 # 若 parameter设置了,则 不替换,parameter 的值不变 # a=1 # b=2 # a=${b:=3} # echo $a 2 # echo $b 2 # 三 ${parameter:+word} 若 parameter 设置了,则用 word 代替 parameter 进行替换,parameter 的值不变 # a=1 # unset b # a=${b:+3} # echo $a # echo $b # a=1 # b=2 # a=${b:+3} # echo $a 3 # echo $b 2 # 四 ${parameter:?message} 若 parameter 为空或未设置,则 message 作为标准错误打印出来,这可用来检查变量是否正确设置 # unset a # ${a:?unset a} -bash: a: unset a
变量替换-匹配截取
${变量#关键词} 若变量内容从头开始的数据符合『关键词』,则将符合的最短数据切除 ${变量##关键词} 若变量内容从头开始的数据符合『关键词』,则将符合的最长数据切除 ${变量%关键词} 若变量内容从尾向前的数据符合『关键词』,则将符合的最短数据切除 ${变量%%关键词} 若变量内容从尾向前的数据符合『关键词』,则将符合的最长数据切除 ${变量/旧字符串/新字符串} 若变量内容符合『旧字符串』则『第一个旧字符串会被新字符串替代』 ${变量//旧字符串/新字符串} 若变量内容符合『旧字符串』则『全部的旧字符串会被新字符串替代』 索引及切片 [root@newrain ~]# a=12345678 [root@newrain ~]# echo ${a:5} //从第5位开始截取 678 [root@newrain ~]# echo ${a:3:4} 4567 [root@newrain ~]# echo ${a:2:-1} 34567 [root@newrain ~]# echo ${a:2:-2} 3456 [root@newrain ~]# url=www.sina.com.cn [root@newrain ~]# echo ${#url} //获取变量的长度 15 [root@newrain ~]# echo ${url} //正常显示变量 www.sina.com.cn 变量内容的删除 [root@newrain ~]# echo ${url#*.} 从前往后,最短匹配 sina.com.cn [root@newrain ~]# echo ${url##*.} 从前往后,最长匹配 cn [root@newrain ~]# echo ${url%.*} 从后往前,最短匹配 www.sina.com [root@newrain ~]# echo ${url%%.*} 从后往前,最长匹配 www [root@newrain ~]# echo ${url#a.} www.sina.com.cn [root@newrain ~]# echo ${url#*a.} com.cn 变量内容的替换 $ a=123456123789 $ echo ${a/1/} 第一次匹配的被替换 23456123789 $ echo ${a//1/} 全局的匹配被替换 2345623789 $ echo ${a/1/x} x23456123789 $ echo ${a//1/x} x23456x23789 例: file=/dir1/dir2/dir3/my.file.txt ${file#*/}: 拿掉第一条 / 及其左边的字符串:dir1/dir2/dir3/my.file.txt ${file##*/}: 拿掉最后一条 / 及其左边的字符串:my.file.txt ${file#*.}: 拿掉第一个 . 及其左边的字符串:file.txt ${file##*.}: 拿掉最后一个 . 及其左边的字符串:txt ${file%/*}: 拿掉最后条 / 及其右边的字符串:/dir1/dir2/dir3 ${file%%/*}: 拿掉第一条 / 及其右边的字符串:(空值) ${file%.*}: 拿掉最后一个 . 及其右边的字符串:/dir1/dir2/dir3/my.file ${file%%.*}: 拿掉第一个 . 及其右边的字符串:/dir1/dir2/dir3/my 记忆的方法为: # 是去掉左边(在键盘上 # 在 $ 之左边) % 是去掉右边(在键盘上 % 在 $ 之右边) 单一符号是最小匹配;两个符号是最大匹配(贪婪匹配)。 $ a=123 $ echo ${#a} 表示$var的长度 3
basename & dirname
basename 命令 basename 是去除目录后剩下的名字 # 不会检测文件系统,只是取路径的最后一段,将他截取出来 例: #temp=/home/temp/1.test #base=`basename $temp` #echo $base 结果为:1.test dirname 是去除文件的目录名 # 不会检测文件系统,默认路径的最后一段为文件名,把它扇区 例: #temp=/home/temp/1.test #dir=`dirname $temp` #echo $dir 结果为:/home/temp dirname 获取当前脚本的路径 $( cd $( dirname $0 ) ; pwd )
六、shell编程-流程控制
shell编程-条件结构
测试 test 条件 条件为真返回 0,条件为假返回 1 [ 条件 ] test 能够理解3种类型的表达式 1.文件测试 2.字符串比较 3.数字比较 字符串 -n STRING # -n 字符串长度不为零 -z STRING # -z 字符串长度为0 STRING1 = STRING2 # = 判断两个字符串是否一样 STRING1 != STRING2 # != 判断两个字符串是否不一样 数字 eq 等于 ne 不等于 # ge 大于等于 le 小于等于 # gt 大于 lt 小于 # 文件 test -f 存在且是普通文件 # 重要 -d 存在且是目录 # -h 存在且是符号链接 -b 块设备 -c 字符设备 -e 文件存在 #
shell分支if语句
流控制: •在一个shell脚本中的命令执行顺序称作脚本的流。大多数脚本会根据一个或多个条件来改变它们的流。 •流控制命令:能让脚本的流根据条件而改变的命令称为条件流控制命令 •exit语句:退出程序的执行,并返回一个返回码,返回码为0正常退出,非0为非正常退出,例如: •exit 0 条件判断 If代码返回0表示真,非0为假 if语句语法如下: 1 if [ $1 -eq 1 ] then echo '等于1' elif [ $1 -eq 2 ] then echo '等于二' else echo '既不等一,也不等于二' fi 例: #!/bin/bash read -p "请输入号码: " num if [ $num = 1 ];then echo "1" elif [ $num = 2 ];then echo "2" else echo "输入有误!" fi 例:脚本if.sh,必须在脚本后加上适当的参数脚本才能正确执行 #!/bin/bash if [ "$1" = "hello" ]; then echo "Hello! How are you ?" elif [ "$1" = "" ]; then echo "You MUST input parameters" else echo "The only accept parameter is hello" fi 练习(选做): 1)检测apache是否运行,如果没有运行则启动,并记录启动的时间,保存到日志中。 2)测试ip地址主机位从2到100的机器是否存活,并把存活的机器记录到文本文件alivehost.txt内。(使用ping命令) 多个条件联合 逻辑与 if [ $condition1 ] && [ $condition2 ] if [ $condition -a $condition2 ] if [[ $condition1 && $condition2 ]] 逻辑或 if [ $condition1 ] || [ $condition2 ] if [ $condition -o $condition2 ] if [[ $condition1 || $condition2 ]] # test 和 [] 中 我们可以使用 [ $condition1 ] && [ $condition2 ] 或者 [ $condition -a $condition2 ] # 在 [[]] 这种情况,我们可以直接使用[[ $condition1 && $condition2 ]] 建议在if中直接使用[[]]这种方式,这种方式更加稳定。[[]] shell的一个命令。 -a && 逻辑与 and 两端的条件都可以成立 -o || 逻辑或 or 两端的条件有一段成立就行 练习: 编写脚本port.sh,执行脚本后显示系统的httpd、ftp、ssh、sendmail这些服务是否开启 case case 语句是 shell 中流控制的第二种方式,语法如下: case $word in pattern1) list1 ;; pattern2) list2 ;; patternN) listN ;; *) list* ;; esac 命令;;表明流应该跳转到case语句的最后,类似C语言中的break指令。 练习:建立脚本case.sh,当执行时,要求我们在键盘输入适当的值(one|two|three),当输入正确时并打印,当输入错误 时会提示你,应该输入正确的值。
作业1
作业 1. ping主机测试 2. 判断一个用户是否存在 3. 判断当前内核主版本是否为3,且次版本是否大于10 4. 判断vsftpd软件包是否安装,如果没有则自动安装 (yum是否能用,不能用自动修复,安装完成测试以下,是否能用。) 5. 判断httpd是否运行 6. 判断指定的主机是否能ping通,必须使用$1变量 7. 报警脚本,要求如下: 根分区剩余空间小于20% 内存已用空间大于80% 向用户alice发送告警邮件 配合crond每5分钟检查一次 echo "邮件正文" | mail -s "邮件主题" alice 可以报警 8. 判断用户输入的是否是数字 read -p "请输入:" get case $get in [0-9][0-9]*) #判断输入是否是数字 echo -e "你输入是数字。\n" ;; *) echo -e "你输入的不是数字。\n" ;; esac
shell 分支case语句
case $var in 模式1) 执行1 ;; 模式2) 执行2 ;; 模式3) 执行3 ;; *) 执行4 esac 第一行: 声明case关键字调用case语法, 紧跟的“变量”一般为用户的输入值, in代表从下方的各个模式进行匹配 第2-4行: 匹配到“模式1”后进行命令的输出或执行, 模式1: 一般为字符或数值 第11-12行: 当用户输入的字符不存在匹配模式时, 直接执行或打印*)下的命令或语句
示例:
[root@bavdu shell_scripts]# vim system_tools #!/usr/bin/env bash cat <<-EOF +-------------------------------------------------------------------------+ | System_tools V1.0 | +-------------------------------------------------------------------------+ | a. Stop And Disabled Firewalld. | | b. Disabled SELinux Secure System. | | c. Install Apache Service. | | d. Quit | +-------------------------------------------------------------------------+ EOF echo "Please input your select: " && read var case "$var" in "a") systemctl stop firewalld && systemctl disable firewalld ;; "b") setenforce 0 ;; "c") yum -y install httpd httpd-tools ;; "d") exit ;; *) printf "请按照上方提供的选项输入!!!\n" ;; esac
补充:
`` 和 $() 可以嵌套使用
echo -e \n
- echo: 输出字符串或变量。
- -e: 允许解释转义字符。
- \n: 换行符。
fgrep
写什么就匹配啥
grep 过滤的是大概
在git仓库把代码放到linux中
然后在linux中要下载
yum -y install git
然后从图片的https连接复制
在linux中输入 git clone 链接
解释:
git
: 这是 Git 版本控制系统的命令行工具。clone
: 这是 Git 的一个命令,用于克隆(或复制)一个仓库到本地
tr
以下是tr命令在Linux中的一些常见用法:
- 字符替换:将输入流中的某些字符替换为其他字符。例如,将小写字母替换为大写字母:
bash复制代码
echo "hello, world!" | tr 'a-z' 'A-Z'这将输出:HELLO, WORLD!
2. 删除字符:使用-d选项删除文本中的某些字符。例如,删除文本中的所有数字:bash复制代码
echo "abc123def456" | tr -d '0-9'这将输出:abcdef
3. 压缩字符:使用-s选项将文本中连续重复的字符压缩为一个字符。例如,压缩文本中的连续空格:bash复制代码
echo "hello world" | tr -s ' '这将输出:hello world
请注意,当不提供字符集2时,tr命令将按照字符集1中字符的顺序删除这些字符。
此外,tr命令还可以与文件一起使用,对文件内容进行字符替换、删除或压缩操作。例如,使用以下命令将文件file.txt中的小写字母替换为大写字母:
bash复制代码
tr 'a-z' 'A-Z' < file.txt这将把file.txt中的小写字母替换为大写字母,并将结果打印到标准输出流。
总之,tr命令在Linux中提供了强大的字符处理功能,能够方便地执行字符替换、删除和压缩操作。