Linux 学习记录37(C高级篇)
本文目录
- Linux 学习记录37(C高级篇)
- 一、常见的shell解析器
- 二、变量
- 1. shell脚本外部传参
- 2. 输入输出
- (1. 输出
- (2. 输入
- 3. 命令置换符
- 4. shell中的数组
- 三、shell中的算数运算
- 1. (())运算
- 2. $[ ]运算
- 3. let运算
- 4. expr指令
- (1.数据运算
- (3. 字符运算
- 四、shell中的分支结构
- 1. if
- (1. if单分支语句
- (2. if多分支语句
- 2. test指令
- (1. 对数据
- (2. 对字符串
- (3. 对文件操作
- 思维导图
- 练习
- 1. 编写一个名为myfirstshell.sh的脚本,它包括以下内容
- 2. 写一个shell脚本,获取当前用户名,用户id和工作路径
- 3. 编写脚本,计算/etc/passwd文件中的第10个用户和第20用户的ID之和
- 4. 输入学生成绩,判断等级
一、常见的shell解析器
- bash:与终端的交互性较好,一般用于linux使用的都是bash
- sh:与终端的交互器较差,开发板的解析器常用的是sh
二、变量
1. shell脚本外部传参
#!/bin/bash
#获取外部参数个数(不包含脚本名)
echo "$#"
#直接获取所有参数
echo "$@/$*"
#打印外部参数
echo "$1 $2 $3"
#如果参数的位置>=10则需要加上{}
echo "${10}"
功能:
2. 输入输出
(1. 输出
echo 要输出的内容
1. 会自动换行
2. 默认不解析转义字符
参数:
1. -n:取消换行
2. -e:解析转义字符
(2. 输入
read var ---->read后面直接跟变量名,如果read后面接多个变量,多个变量获取数据时以空格作为分隔
#如果没有多个变量,空格会作为字符串的一部分
read -p "提示信息" var #-p用于输出提示信息
read -s var #不回显终端的输入
read -t 4 var #如果4秒不输入,就结束输入
raed -n 3 var #输入三个字符就停止
3. 命令置换符
将指令运行的结果赋值给变量
val=`ls` 反引号
将ls的结果赋值给变量val
=============================
val=$(ls)
将ls的结果赋值给变量val
4. shell中的数组
shell中只有一维数组,shell中支持 稀疏数组 ,shell中支持变长数组
稀疏数组:不连续赋值变量的数组
定义:
数组名=(初始值1 初始值2 初始值3 ...)
arr=(11 22 33 hello)
=================================
数组名=([下标1]=初始值1 [下标3]=初始值3 [下标5]=初始值5 ...) #稀疏数组
arr=([1]=11 [3]=33 [5]55 [7]=hello)
能够不按顺序赋值
=================================
访问变量
arr[6]=99 #给变量赋值
echo ${arr[5]} #访问数组中的第6个元素
echo ${arr} #访问数组中的第1个元素
echo ${arr[@]} #访问数组中的全部元素
echo ${arr[*]} #访问数组中的全部元素
echo ${#arr[*]} #统计数组中的全部元素个数
echo ${#arr[@]} #统计数组中的全部元素个数
echo ${#arr[3]} #统计数组中这个元素字符的个数
==================================
arr=(12 566 hello)
arr1=([0]=90 [5]=100 [7]=67) #稀疏数组,数组中的下标不连续
#arr2和arr3的区别,在于元素个数的不同,因为arr2中两个数组链接时没有加空格
arr2=(${arr[*]}${arr1[@]})
arr3=(${arr[*]} ${arr1[@]})
echo ${arr2[2]} #hello90
echo ${arr3[2]} #hello
三、shell中的算数运算
shell是弱数据类型的语法
所以shell擅长执行指令,不擅长做运算操作,所以通常需要借助工具完成运算
如:(()),$[],let,expr
1. (())运算
1. (())常用于整形数据运算
2. 支持大部分的C语言语法,并支持C语法中的复杂语法
3. 支持幂运算,**
4. 在(())内使用变量可以加$,也可以不加$,(())的两侧可以有空格,也可以没有空格
5. 使用var1=$((var1+var2)),获取计算结果
#!/bin/bash
var1=91
var2=81
var1=$((var1+var2))
echo ${var1}
===============================
幂运算:
#!/bin/bash
var2=3
var2=$((var2**3))
echo ${var2}
===============================
一个括号内可以存放多个表达式,表达式都会依次执行
#!/bin/bash
var1=10
var2=90
((var1=var1**3,var2++,++var2,var2=var1+var2))
echo $var1
echo $var2
示例:
#!/bin/bash read -p "请输入第一个参数" var1 read -p "请输入第二个参数" var2 echo "两数和:$((var1+var2))" echo "较大值:$(((var1>var2)?var1:var2))"
结果:
2. $[ ]运算
计算结果必须使用变量名接收
格式:变量名=$[表达式1,表达式2,表达式3…]
1. 可以有空格,也可以没有空格
2. 使用变量可以加$,也可以不加$
#!/bin/bash
var1=10
var2=11
var3=$[var1+var2]
echo ${var3}
3. let运算
1. 格式:let 变量名=表达式,let和变量名间一定要加空格
2. 运算符两侧不能有空格
3. 使用变量可以加$,也可以不加$
4. let 必须放在最前面
#!/bin/bash
var1=10
var2=11
#let运算时可以加$也可以不加
let sum=$var1+var2
echo ${var3}
4. expr指令
格式:expr 表达式
1. 使用变量时必须加$
2. 算数运算的两侧一定要加空格
3. expr不支持自增自减
4. 会自动回显不支持幂运算
5. 特殊字符需要转义,如 . * > < 等等符号需要加\转义,如\*
6. 运算结果需要命令置换符获取
7. 支持更多的运算,可以使用man手册查看
8. 不存在逻辑短路现象
9.
(1.数据运算
#!/bin/bash
var1=10
var2=11
expr $var1 + $var2
=============================
#!/bin/bash
var1=10
var2=11
#特殊字符需要转义,如 . * > < 等等符号需要加\转义,如\*
expr $var1 \* $var2
=============================
#!/bin/bash
var1=10
var2=11
#运算结果需要命令置换符获取
var3=`expr $var1 \* $var2`
=============================
支持的运算
ARG1 | ARG2 若ARG1 的值不为0,则返回ARG1,否则返回ARG2,arg1不能为空
ARG1 & ARG2 若两边的值都不为0,则返回ARG1,否则返回 0
ARG1 < ARG2 ARG1 小于ARG2
ARG1 <= ARG2 ARG1 小于或等于ARG2
ARG1 = ARG2 ARG1 等于ARG2
ARG1 != ARG2 ARG1 不等于ARG2
ARG1 >= ARG2 ARG1 大于或等于ARG2
ARG1 > ARG2 ARG1 大于ARG2
ARG1 + ARG2 计算 ARG1 与ARG2 相加之和
ARG1 - ARG2 计算 ARG1 与ARG2 相减之差
ARG1 * ARG2 计算 ARG1 与ARG2 相乘之积
ARG1 / ARG2 计算 ARG1 与ARG2 相除之商
ARG1 % ARG2 计算 ARG1 与ARG2 相除之余数
(3. 字符运算
expr match STRING REGEXP
返回REG在STRING中,完全匹配的个数(从第一位开始匹配)
expr substr STRING POS LENGTH
从string中pos下标的位置开始,截取长度为length的子串,下标从1开始
expr index STRING CHARS
返回多个字符中,最先在string出现的字符的位置
expr length STRING
求字符串的长度
=============================
#!/bin/bash
read net
pos1=`expr index $net '.'` #找第一个.的位置
str1=`expr substr $net 1 $((pos1-1))`
len=`expr length $net` #求网址的长度
#新的字符串,不包括www.的字符串
temp=`expr substr $net $((pos1+1)) $len`
pos2=`expr index $temp '.'` #找到新截取的子串中.的位置
str2=`expr substr $temp 1 $((pos2-1))`
str3=`expr substr $temp $((pos2+1)) $len`
arr=($str1 $str2 $str3)
echo ${arr[0]}
echo ${arr[1]}
echo ${arr[2]}
功能:
四、shell中的分支结构
1. if
(1. if单分支语句
#!/bin/bash
if [ 表达式 ] #表达式前后的表达式的空格是必须的
then #表示条件成立
else #表示条件不成立
fi #表示if条件语句结束
#有一个if就必须有一个then和fi
(2. if多分支语句
格式:
#!/bin/bash
if [ 表达式1 ] #表达式前后的表达式的空格是必须的
then #表示条件成立
elif [ 表达式2 ]
then
#表达式1不成立表达式2成立执行的语句块
else
#表达式1不成立表达式2也不成立执行的语句块
fi #表示if条件语句结束
2. test指令
test的作用相当于C中关系运算
(1. 对数据
操作数 | 功能 |
---|---|
-eq | 相等 |
-ne | 不相等 |
-ge | 大于等于 |
-gt | 大于 |
-le | 小于等于 |
-lt | 小于 |
-a | 逻辑与 |
-o | 逻辑或 |
例:求润平年
#!/bin/bash
read year
#在test内使用-a和-o判断,在test外面可以使用||和&&
if [ $((year%4)) -eq 0 -a $((year%100)) -ne 0 ] || test $((year%400)) -eq 0
then
echo "${year}是闰年"
else
echo "${year}是平年"
fi
(2. 对字符串
操作数 | 功能 |
---|---|
-z | 判断字符串为空 |
-n | 判断字符串非空 |
(3. 对文件操作
操作数 | 功能 |
---|---|
-b | 存在且为块设备文件 |
-c | 存在且为字符设备文件 |
-e | 文件存在 |
-f | 文件存在且为普通文件 |
-d | 文件存在且为目录文件 |
-s | 文件存在且不为空 |
-S | 文件存在且为套接字文件 |
-h/-L | 文件存在且为链接文件 |
-x | 文件是否有可执行权限 |
思维导图
练习
1. 编写一个名为myfirstshell.sh的脚本,它包括以下内容
1、包含一段注释,列出您的姓名、脚本的名称和编写这个脚本的目的
2、和当前用户说“hello 用户名
3、显示您的机器名 hostname
4、显示上一级目录中的所有文件的列表
5、显示变量PATH和HOME的值
6、显示磁盘使用情况
7、用id命令打印出您的组ID
8、跟用户说“Good bye”
==============================================================
#!/bin/bash
#name:XH filename:shell01.sh function:Print parameters
buf1=(`id`)
pos1=`expr index ${buf1[0]} '\('`
pos2=`expr index ${buf1[0]} '\)'`
pos3=$[pos2-pos1-1]
user=`expr substr $buf1 $[${pos1}+1] $pos3`
echo "Hello $user"
echo "device name: "$(hostname)
echo "../: "$(ls ../)
echo "PATH: "$PATH
echo "HOME: "$HOME
buf2=(`df -h`)
echo "${buf2[*]}"
echo "${buf1[1]}"
echo "Goodbye $user"
2. 写一个shell脚本,获取当前用户名,用户id和工作路径
#!/bin/bash
buf1=(`id`)
pos1=`expr index ${buf1[0]} '\('`
pos2=`expr index ${buf1[0]} '\)'`
pos3=$[pos2-pos1-1]
user=`expr substr $buf1 $[${pos1}+1] $pos3`
pos1=`expr index ${buf1[0]} '\='`
pos2=`expr index ${buf1[0]} '\('`
pos3=$[pos2-pos1-1]
uid=`expr substr $buf1 $[${pos1}+1] $pos3`
echo "User: $user"
echo "Uid: $uid"
echo work:$(pwd)
3. 编写脚本,计算/etc/passwd文件中的第10个用户和第20用户的ID之和
#!/bin/bash
buf1=`head -10 /etc/passwd | tail -1 | cut -d ":" -f "3"` #
buf2=`head -20 /etc/passwd | tail -1 | cut -d ":" -f "3"` #
echo $((buf1 + buf2))
4. 输入学生成绩,判断等级
#!/bin/bash
read -p "请输入学生成绩:" val1
if test $val1 -le 100 -a $val1 -ge 90
then
echo "A"
elif test $val1 -lt 90 -a $val1 -ge 80
then
echo "B"
elif test $val1 -lt 80 -a $val1 -ge 70
then
echo "C"
elif test $val1 -lt 70 -a $val1 -ge 60
then
echo "D"
fi