shell 判断grep返回值_年薪百万之路--第七十八天 Linux基础 shell

本文介绍了Linux shell脚本的基础知识,包括变量、脚本执行方式、正则表达式以及进阶的脚本算法、信息比较和判断语句。重点讲解了如何利用grep的返回值进行条件判断,如if和case语句的应用,并探讨了循环语句(for、while、until)的概念。此外,还提到了脚本函数和数组的使用,帮助读者提升shell脚本编写能力。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

7d0d2b88a51a9001f53991838af9f8ce.png

一. 基础知识部分:

· 变量知识概念

1)常规变量:

临时定义方式: 在脚本中或命令行中设置  		oldboy=123	
永久定义方式: 在特殊系统变量文件中设置		/etc/profile  /etc/bashrc  ~/.bashrc ~/.bash_profile

设置变量:

① 进行字符串设置 name="oldboy" name=”123456" name="oldboy edu python"

② 进行变量调用 info="python" name="$info"

③ 进行命令信息设置 IP_info="$(hostname -i)" IP_info=`hostname -i`

2)环境变量

export INFO="XXXX"

 有export定义变量:对当前登录窗口所有shell都生效
 无export定义变量:只对当前shell生效

变量赋值方式:

	   ① 直接赋值:  a=1 b=2  echo $a $b
          service 启动或重启或停止服务
       
           ② 传参赋值:  a=$1 b=$2  ./test.sh  oldboy oldgirl	 ./test.sh  "oldboy oldgirl" oldman  
	
	   ③ 交互赋值:  需要交互询问信息进行赋值
	      read -p "请输入学员姓名: " name age
	      echo $name >> class.txt
	      echo $age >> class.txt

3) 特殊变量

                $0:	用于获取脚本名称信息,直接显示脚本名称和路径信息
		echo "$0脚本执行失败,请检查脚本逻辑"
		
		$#:统计出脚本的传入参数总数
		
		$*:输出脚本所有参数信息
		
		$@:输出脚本所有参数信息
		
		$?:输出命令执行返回值  利用返回值可以判断命令是否执行成功
		    0 		表示操作执行成功
			非0		表示操作执行失败
		
		$$  获取一个脚本执行PID信息
		
		$!  获取上一个程序或脚本后台运行pid信息
		    sh test.sh &    --- 让脚本后台运行
		
		$_  获取脚本的最后一个参数信息
		    sh test.sh  a b c 
			echo $_
			c 

· 脚本执行方法

① 直接授权脚本执行权限,直接运行脚本

./test.sh /root/test.sh

② 利用命令信息执行脚本

sh ./test.sh bash ./test.sh --- 利用命令解释器执行脚本

source ./test.sh --- 脚本之间信息加载调用

· 系统正则知识

基础正则符号:^ $ ^$ . * .* [] [^]

	  ^	:	可以匹配以指定信息开头内容
	  $	:	可以匹配以指定信息结尾内容
	  ^$:  可以匹配空行信息
	        grep -vE "^$|^#" test.txt		--- 排除注释信息和空行信息
	
	  . :  匹配任意且只有一个字符信息
	  * :  匹配任意一个字符连续出现0次或多次情况
	  .*:	匹配任意所有字符信息
	  
	   :	转义符号信息 (将有意义信息变得没有意义 将没有意义的信息变得有意义)
	    
      []:   批量取出多个字符信息 大写字母 A B 		
      [^]:  排除指定多个字符信息 进行过滤 
	  grep 过滤 sed 编辑 awk 分析  --- 直接加载基础正则

扩展正则符号:+ | {} () ?

	  grep -E 过滤 sed -r 编辑  awk 分析
	  
	  + :	匹配任意一个字符连续出现1次或多次情况
	  
	  | :   可以匹配多个信息,多个信息之间是或者关系
	  
	  {} : 可以指定连续匹配的次数信息 
	        {n} 	正好连续n次
			{n,}	最少连续出现n次,超过n次默认匹配	  
            {,n}    最多连续出现n次,少于n次默认匹配‘
			{n.m}   最少连续出现n次,最多匹配连续出现m次

     ():  将多个字符信息当成一个整体进行匹配
	 
	   ? :	匹配任意一个字符连续出现0次或1次情况
		 
	  man grep/sed/awk 

二.进阶知识部分

· 脚本算法知识

    ① $(())  --- 实现数值信息运算(只支持整数运算)
	echo $((1+2))
 
    ② 自增自减运算
	自减运算:$((a--))
	[root@web01 ~]# a=10
    [root@web01 ~]# echo $((a--))
    10
    [root@web01 ~]# echo $((a--))
    9
    [root@web01 ~]# echo $((a--))
    8
    [root@web01 ~]# echo $((a--))
    7
	
	[root@web01 ~]# a=10
    [root@web01 ~]# echo $((--a))
    9

	自增运算:$((a++))
	[root@web01 ~]# a=10
    [root@web01 ~]# echo $((a++))
    10
    [root@web01 ~]# echo $((a++))
    11
    [root@web01 ~]# echo $((a++))
    12
    [root@web01 ~]# echo $((a++))
    13
    [root@web01 ~]# echo $((a++))
	
	[root@web01 ~]# a=10
    [root@web01 ~]# echo $((++a))
    11

    ③ let  --- 实现数值信息运算 (只支持整数运算)
	[root@web01 ~]# i=2
    [root@web01 ~]# let i=i+8
    [root@web01 ~]# echo $i
    10

    ④ expr  --- 实现数值信息运算 (只支持整数运算)
    [root@web01 ~]# expr 1 + 1
    2
    [root@web01 ~]# expr 2-1
    2-1
    [root@web01 ~]# expr 2 - 1
    1
    [root@web01 ~]# i=1
    [root@web01 ~]# expr $i - 1
    0
    
    ④ bc  --- 实现数值信息运算 但是只是整数和小数
    [root@web01 ~]# echo 3+5|bc
    8
    您在 /var/spool/mail/root 中有邮件
    [root@web01 ~]# echo 3.3+5.3|bc
    8.6
    [root@web01 ~]# echo 3.3679+5.30987|bc
    8.67777     

· 脚本信息比较

数值信息比较:

eg:记录学员信息,如果学员年龄信息大于30岁,不能进行录取
	# cat test.sh 
    #!/bin/bash
    read -p "请问你的年龄多少:" age
    if [ $age -gt 30 ]
    then
      echo 不能进行录取
    else
      echo 欢迎加入
    fi

-lt 表示小于

-gt 表示大于

-eq 表示等于

-ne 表示不等于

-le 表示小于等于

-ge 表示大于等于

字符信息比较:

eg:验证员工口令,口令通过可以进入公司
	#!/bin/bash
    read -p "请说出口令信息:" age
    if [ "$age" == "天王盖地虎" ]
    then
      echo 欢迎
    else
      echo 有入侵
    fi

        ==  表示字符串信息匹配成功
	!=  表示字符串信息匹配失败 

· 判断语句说明

if判断语句:

1)单分支判断语句

	   如何... 就 ...
	   if [ 好看 ]
	   then
	      和他/她在一起
	   fi

2)双分支判断语句

	   如何... 就 ... 否则 ...
	   if [ 好看 ]
	   then
	      和他/她在一起
	   else
	      培养培养
	   fi

3)多分支判断语句

如何 首选条件成立 就... 次选条件成立 就... 再次选条件成立 就... 否则 ....

	   if [ 好看 ]
	   then
	      和他/她在一起
	   elif [ 身材好 ]
	   then
	      和他/她在一起
	   elif [ 家境好 ]
	   then
	      和他/她在一起
       else
          先单身
       fi 		  

eg01:输入两个数字 判断两个数字是否是整数

	#!/bin/bash 
	read -p "请输入第一个数字: "  num1
	read -p "请输入第二个数字: "  num2
	if [ -z "$num1" ]
	then
	    echo "输入的第一个数字为空,请重新输入"
		exit 
	elif [ -z "$num2" ]
	then
	    echo "输入的第二个数字为空,请重新输入"	
	    exit
    elif [[  "$num1" =~ ^[0-9]+$ && "$num2" =~ ^[0-9]+$ ]]
	then 
	    echo "输入内容均为整数"
    else 
	    echo "输入内容非整数信息"
		exit
	fi

eg02:判断当前网络地址中,有哪些地址是已使用地址,有哪些地址是未使用地址?

	10.0.0.0/24  10.0.0.1 ~ 10.0.0.254
	ping -c 3 -W 3
	
	#!/bin/bash 
	for ip in 10.0.0.{1..254}  10.0.0.2
	do 
	   { ping -c 3 -W 3 $ip &>/dev/null
	   if [ $? -eq 0 ]
	   then 
	       echo $ip is online
	   else 
	       echo $ip is offline
	   fi } &
	done 
	

eg03: 猜商品价格(1-100) 已知鼠标=50 随机

	如何生成随机数字:
	方法一:通过random变量产生随机数
    echo $RANDOM  0-32768
	方法二:通过openssl命令产生随机数
	openssl rand -base64 10
	方法三:通过时间信息获取随机数
	date +%S%N
	方法四:利用UUID文件生成随机数
	cat /proc/sys/kernel/random/uuid
	
	#!/bin/bash 
	num=`echo $((RANDOM%100+1))`
    echo $num >/tmp/oldboy.txt 
	while true  
	do 
	   let i++
	   read -p "请输入一个数字[1-100]: " info 
	   if [ $info -gt $num ]
	   then 
	      echo "你输入的数字大了"
	   elif [ $info -lt $num ]
	   then 
	      echo "你输入的数字小了"
       else
          echo "恭喜你猜对了 总共猜了 $i 次"
          exit
       fi	
         done	  

case判断语句: 流程控制语句 == 多分支语句
语句格式:
case 变量名 in
模拟匹配1)
模式1匹配处理
;;
模拟匹配2)
模式2匹配处理
;;
模拟匹配3)
模式2匹配处理
;;
*)
其他匹配处理
esac

eg01:根据学习课程显示报价:

	 #!/bin/bash 
	 echo -e "老男孩课程说明npython课程nlinux课程n网络安全"
	 read -p "请选择要学习课程,可以提供价格参考:" name
	 case $name in 
	 python|PYTHON)
	      echo python 课程 20000 元
		  ;;
	 linux|LINUX)
	      echo linux  课程 15000 元
		  ;;
	 网络安全)
	      echo 网络安全课程 10000 元
		  ;;
		  *)
		  echo 您输入课程参数无法提供
	 esac

eg02:菜单功能进行自动化管理

	 #!/bin/bash 
	 meun() {
	 cat <<EOF
	 1. 显示系统负载信息
	 2. 显示系统磁盘信息
	 3. 显示系统内存信息
	 4. 显示系统登录用户
	 EOF 
	 }
	 
	 while true 
	 do 
	 read -p "请输入想要查看的系统信息编号:" num 
	 case $num in 
	 1) 
	    uptime
		;;
	 2)
	    df -h 
		;;
     3) 
	    free -h 
		;;
	 4) 
	    w 
		;;
	 *)
	    echo 请输出选项编号
	 esac
	 done 

· 循环语句说明 for while until

     for循环:有限循环  
	 for 变量名称 in 循环范围  {1..10} / oldboy oldgirl oldman / `cat user_list.txt`
	 do 
	    循环操作命令 
	 done 
	 
	 #!/bin/bash 
     for user in oldman{01..03}
     do
       useradd $user
     done

while循环:无限循环(守护进程)

当设置为有限循环时,只有条件不满足时,循环结束

	 while 条件=true 	循环就会一直执行
	 while 条件=false 	循环就会立刻终止
	 
	 无限循环:
	 while true
	 do 
	   每次循环做的操作
	 done 
	 
	 有限循环:
	 while [ 条件表达式 ]
	 do
	   每次循环做的操作 
	 done

until循环:无限循环(守护进程)

当设置为有限循环时,只有条件满足时,循环结束

	 until 条件=true  	循环就会立刻终止
     until 条件=false 	循环就会一直执行
	 
	 无限循环:
	 until false
	 do 
	   每次循环做的操作
	 done 
	 
	 有限循环:
	 while [ 条件表达式 ]
	 do
	   每次循环做的操作 
	 done	 

三.高级知识部分

· 脚本函数概念

概念:命令的集合 完成特定功能代码块 代码块可以实现复用

	  函数名称() {
	     [ $# -ne 2 ] && echo 输入两个参数
	  }

函数定义方法:

	  三种方式定义
	  test1() {
	     echo '定义第一个函数'
	  }
	  
	  funcation test2() {
	     echo '定义第二个函数'
	  }	 

      funcation test3 {
	     echo '定义第二个函数'
	  }	  
	  
	  test1
      test2	 
      test3 	  

· 脚本数组概念

将大量不同元素进行整合汇总,汇总信息称为数组

array[xx]=(oldboy oldgirl oldman)

设置一个数组

array=(oldboy oldgirl oldman)

调用数组中指定元素值

echo ${array[0]}

调用所有数组中元素信息

eg:给班级学员进行学号设置:
	  #!/bin/bash 
	  array=(
	  oldboy
	  oldgirl 
	  oldman
	  alex
	  yuanhao
	  )
	  
	  for ((i=0;i<${#array[*]};i++))
	  do 
	    echo "我是第$i学号学员,我的姓名是${array[$i]},请多关照"
      done
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值