Shell(day03)

本文主要讲解Shell脚本中关于变量的操作,包括获取变量长度、切片、截断、内容替换以及通过let进行算术运算。此外,还介绍了元字符中的算术运算符、测试运算符和赋值运算符的用法,提供了多个练习帮助读者巩固学习。
摘要由CSDN通过智能技术生成

目录

上节复习:

  1. 温故而知新

    应用程序 调用

    操作系统 功能:文件

    计算机硬件 硬盘

  2. 程序的组成

    数据+功能

    变量是一种存取数据的机制 -> 内存

    文件处理(vim,cat,sed,>,>>) ->硬盘

    • 例: 注册功能 将变量存入硬盘(文件)
    read -p "please input your name:" name
    read -p "please input your password: " password
    echo "$name $password" >> user.txt
    
  3. 变量的基本使用

    先定义

    ​ x=10

    在使用

    ​ ${x}

    变量值的三种来源:

    • x=18

    • x=19

    • x=命令 反引号不能嵌套

    • x=$(命令) 小括号可以嵌套

    1. 命令行参数

      • $0 - 9... 9 ... 9...{10}
      • $*
      • $@
      • $#
      • $$
      • $PPID
      • $?
    2. read

  4. 常量

    readonly x=1

  5. 数据类型

    1. 整形
    2. 浮点
    3. 字符串
    4. 数组 declare -a 普通数组只能是数字 declare -A 关联数组可以是字符串

day03

1. 变量值的操作

1. 获取变量值的长度
x="aa   b" 	#2个a 3个空格 1个b
echo ${#x}
expr length "$x"
echo $x | wc -L
echo $x | awk '{print length}'  #必须引号包含

在这里插入图片描述

2. 切片( 截取)
msg="abcdefg"  # 从0开始数
echo ${msg:3}  # 从3号开始截取后面全部
echo ${msg:3:2}  # 从3号开始截取2位
echo ${msg::3}  # 截取头3位 (省略了0)

在这里插入图片描述

3. 截断 (#与%)
# 从左开始吃字符 用#
url="www.baidu.com.cn"
echo ${url#www.}  # 从左边开始删
# echo ${url#ww..}  # 找不到ww..所以没有删除
echo ${url#*.}  # 默认非贪婪 找到第一个. 结束
echo ${url##*.}  #  双井号变贪婪 找到最右边的. 结束
# 从右对 开始切 用%
echo ${url%.cn}  # 从左边开始删
echo ${url%.*}  # 默认非贪婪 找到第一个. 结束
echo ${url%%*.}  # 双%变贪婪 找到最左边的. 结束

在这里插入图片描述

4. 内容替换
url="www.baidu.com.cn"
echo ${url/baidu/QQ}  # url="www.QQ.com.cn"
echo ${url/c/C}  # 非贪婪,www.baidu.Com.cn
echo ${url//c/C}  # 贪婪,www.baidu.Com.Cn
  • 练习
# 题目 批量修改文件名
# touch egon_2020_{01..05}_linux.txt 创建五个文件 修改文件名 去掉_linux
for f in `ls .` ;do mv $f ${f/_linux/} ;done

在这里插入图片描述

5. let
age=18
expr $age + 1  # 显示19 但age值没有改动
age=`expr $age + 1`  # age变成19
let age++  # age变成20
let age--  # age变回19

在这里插入图片描述

# 后++
x=1
let y=x++
echo $y
echo $x
# 前++
j=1
let k=++j
ehco $j
echo $k

在这里插入图片描述

6. 变量替代
${x-临时提示信息}  # x没定义的时候 显示后面提示信息  但x=  这种情况也被当作赋值了 空   一般用下面那种
${x:-临时提示信息} # x没有值(没定义或者为空)  显示后面提示信息   (原变量依旧没值)
${x:=提示信息}  # 当x没值时 打印出提示信息   同时修改x   x=提示信息
${x:+临时提示信息}  # x没值时 无反应 ,有值则 显示临时提示信息 
${x:?临时提示信息}  # x无值则 提示错误并 显示临时提示信息
7. 取命令结果赋值给变量:
``$()
`` 不可以嵌套
()可以嵌套

2. 元字符

1. 算术运算符

运算符:+ - * / %

需要配合下述操作使用:

# 浮点数 
bc  # 若没有安装则需要安装bc命令   yum -y install bc 
#  echo "scale=2;3/10" |bc   小于1 不显示0   scale保留小数位数
# 整数运算(若有浮点数则会报错)
expr  # x=1;y=2;expr $x + $y   
$(())  # echo $(( $x + $y ))
$[]  # echo $[ $x + $y ]
let  # let X++

**补充**: 
expr 2 * 3  # 会直接报错 因为* 有特殊意义
因此 需要加反斜杠'\'
expr 2 \* 3  # 此时即可
补充:free -w
[student@iZbp11lk7w3kj3meeqr47hZ ~]$ free -w
       total        used       free      shared     buffers    cache     available
Mem:  8008964      197592     7000928     432       157220     653224     7557428
      总内存		用户使用     空闲		    共享		 缓冲区    缓冲区

sync  # 可以多刷几次 告诉操作系统把buf的内容往硬盘里输入
echo 3 > /proc/sys/vm/drop_caches  # 释放内存
# free变大 buf cache变小
total: 总内存	
used:   用户使用掉的内存   值 = total-free-buffers-cache 
free(空闲): 真正没有被使用的内存   但是Linux底层有很多优化机制,会借走部分内存
shared(共享) :进程间 可以共同访问使用的内存   (used - shared 的值是进程 真正使用的内存)
buffers(缓冲区): 进程数据从内存存入硬盘时 使用的空间 
cache(缓冲区):   从硬盘中读取数据到内存时 使用的空间
** available: 真正决定你还有多少内存可以使用   会比free小一些  
练习:

**练习1:**求内存使用率 可以使用的内存(available) / 总内存(total)

free  # 查看内存
avail=`free | awk 'NR==2{print $NF}'`  # NR==x x为第几行  NF代表最后一个数 即为available
total=`free | awk 'NR==2{print $2}'`  # $2 第二个数 即为total
echo "scale=2;$avail / $total" | bc  # 进行运算 保留两位小数
res=`echo "scale=2;$avail / $total" | bc`  # 将值保存到res中
echo ${res#.}%  # 去掉左边的点 加上百分号显示

**练习2:**实现 加减乘除功能

# !/bin/bash
read -p "第一个数: " a
read -p "运算符号: " b
read -p "第二个数: " c
if [ $b = + ];then
    s=$[ $a + $c ]
    echo $a$b$c=$s
elif [ $b = - ];then
    s=$[ $a - $c ]
    echo $a$b$c=$s
elif [ $b = * ];then
    s=$[ $a * $c ]
    echo $a$b$c=$s
elif [ $b = / ];then
    s=`echo "scale=2;$a/$c" | bc`
    echo $a$b$c=$s
else
    echo "符号输入错误"
fi

3. 测试运算符

测试命令:test, 详细可用man test查询

测试符号:[ ] ,注意只有一层中括号,中括号左右两侧必须有空格

test 与 [ ] 效果一样,参数也都一样

1. 测试文件状态
  • -d 目录

    真返回0 否则返回1

    test -d ./1.sh; echo $?
    
    [ -d ./1.sh ];echo $?  # 注意括号左右有空格 
    
    
  • -s 文件长度>0,非空返回0,否则返回1

    [ -s 111 ];echo $?  # 文件不存在 返回1 
    touch 111
    [ -s 111 ];echo $?  # 文件存在 但为空 返回1 
    ls > 111  # 往文件内写入内容
    [ -s 111 ];echo $?  # 文件内有内容 返回0 
    
  • -f 是否普通文件

  • -r 是否可读

  • w是否可写

  • -x 是否可执行

  • -u 文件有suid位设置

  • -L 是否是链接文件

在这里插入图片描述

2. 字符串测试(加引号)
  • -n 长度非0 为真
    在这里插入图片描述

    • -z 长度0为真
    • = 相等为真
    • != 不相等为真
3. 测试数值
  • -eq 相等
  • -gt 大于
  • -lt 小于
  • -ge 大于等于
  • le 小于等于
  • -ne 不等于
  • -a 并且 [ 10 -gt 3 ] && [ 3 -le 3 ] => [ 10 gt 3 -a 3 -le 3 ];echo $?
  • -o 或者 [ 10 -gt 30 ] || [ 3 -le 2 ] => [ 10 gt 30 -o 3 -le 2 ];echo $?

4. 关系运行符

  • <
  • >
  • <=
  • >=
  • ==
  • !=
  • &&
  • ||

需要配合 (( ))使用

在这里插入图片描述

5. 赋值运算符

  • =
  • +=
  • *=
  • /=
  • %=

需要配合(( ))使用

小于等于

  • -ne 不等于
  • -a 并且 [ 10 -gt 3 ] && [ 3 -le 3 ] => [ 10 gt 3 -a 3 -le 3 ];echo $?
  • -o 或者 [ 10 -gt 30 ] || [ 3 -le 2 ] => [ 10 gt 30 -o 3 -le 2 ];echo $?

4. 关系运行符

  • <
  • >
  • <=
  • >=
  • ==
  • !=
  • &&
  • ||

需要配合 (( ))使用

在这里插入图片描述

5. 赋值运算符

  • =
  • +=
  • *=
  • /=
  • %=

需要配合(( ))使用
在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值