目录
文章目录
上节复习:
-
温故而知新
应用程序 调用
操作系统 功能:文件
计算机硬件 硬盘
-
程序的组成
数据+功能
变量是一种存取数据的机制 -> 内存
文件处理(vim,cat,sed,>,>>) ->硬盘
- 例: 注册功能 将变量存入硬盘(文件)
read -p "please input your name:" name read -p "please input your password: " password echo "$name $password" >> user.txt
-
变量的基本使用
先定义
x=10
在使用
${x}
变量值的三种来源:
-
x=18
-
x=19
-
x=
命令
反引号不能嵌套 -
x=$(命令) 小括号可以嵌套
-
命令行参数
- $0 - 9... 9 ... 9...{10}
- $*
- $@
- $#
- $$
- $PPID
- $?
-
read
-
-
常量
readonly x=1
-
数据类型
- 整形
- 浮点
- 字符串
- 数组 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. 赋值运算符
- =
- +=
- *=
- /=
- %=
需要配合(( ))使用