# Linux 学习记录37(C高级篇)

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解析器

  1. bash:与终端的交互性较好,一般用于linux使用的都是bash
  2. 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))"

结果:
# Linux 学习记录37(C高级篇)_第1张图片

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]}

功能:

# Linux 学习记录37(C高级篇)_第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 文件是否有可执行权限

思维导图

# Linux 学习记录37(C高级篇)_第3张图片

练习

1. 编写一个名为myfirstshell.sh的脚本,它包括以下内容

1、包含一段注释,列出您的姓名、脚本的名称和编写这个脚本的目的
2、和当前用户说“hello 用户名
3、显示您的机器名 hostname
4、显示上一级目录中的所有文件的列表
5、显示变量PATHHOME的值
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

你可能感兴趣的:(Linux学习记录,linux,学习,c语言)