“这是我参与8月更文挑战的第11天,活动详情查看:8月更文挑战”
什么是shell 脚本?
shell 命令的集合
将shell 命令放到 一个文件中 这个文件就是 shell 脚本
我们遵循 bash shell 脚本编程语法
shell 脚本 以 .sh 作为后缀
shell 属于 解析性语言 不需要编译
C/C++ 属于编译型语言 编译之后才可以 执行
shell语法
#!/bin/bash #用 bash shell 解析器 解析以下语句
变量
var=100
- 注意 在shell中 变量是没有数据类型的 语句后不用 加任何 符号 赋值操作 左值与右值 没有空格 由于shell中没有数据类型 所以 也不区分 整型 字符 字符串 都是以 字符串 处理的
输出:
var=100
echo $var 输出结果 100
echo ${var}
$ 变量值的引用
如果 echo $var 不加 $ 则按 var 字符串输出
#!/bin/bash
var="hello"
echo $var
echo ${var}
echo "$var" 输出hello
echo '$var' 输出 $var
“”与‘’区别就是 “” 会解析变量 ‘’ 不解析内部变量 单纯作为字符串输出
变量可以重新赋值 var=1000 echo $var 输出结果 1000
语句的注释
#:单行注释
:<<EOF //多行注释
shell语句
EOF
......
:<<!
shell语句
!
输入输出
read 变量名
read 变量名1 变量名2 变量名3
read -n 3 var1 var2 var3
read -p “请输入一个数字” var
echo $变量名
echo -n $变量名 //不换行
命令置换
将命令执行的结果 赋给变量
` 不是单引号 在 数字键 1 左边
var=`ls` //#将 ls 命令执行的结果 赋值给 var 变量
var=$(ls)
var2=`echo $var` //#将 echo $var d的结果 赋值给 var2
位置变量
$0 第一个命令行参数
$1 第二个命令行参数
$2 第三个命令行参数
${n}第n个命令行参数
$# 命令行参数个数 不记算执行程序文件名
$@ 显示命令行所有的参数 不包含 可执行程序
$* 与 $@ 相同
$$ 获取执行脚本的进程号 (进程号 在IO进程讲授)
字符串操作
字符串拼接 (C语言中 strcat)
var=hello
var2='hello'world
var3="$var $var2"
字符串拷贝 (C语言中 strcpy)
字符串长度获取 (C语言 strlen)
echo ${#变量名}
截取字符串 (C语言 strstr)
var=‘www.Hqyj.com’
${变量名:1:4} //从变量前 1 开始向后 截取 4 个字符 字符串从 0 开始计数
//如果截取数量 大于字符串总长度 则 全部截取
${变量名:n} //从 变量 前 1 字符开始 向后的字符全部截取
//如果 n 大于字符串总长度 则截取 0 个 空
//如果 n 小于 0 则全部截取
${变量名:0-3:n} //从变量后边向前截取 3 个字符 要前 2 个字符
//如果 n 大于 3 则依然 截取 3 个 并 全部获取
${变量名:0-n} //从 变量后边截取 n 个字符
${变量名#*cc} //cc 是字符 *通配符 可以统配任意多个字符
//找到 第一次出现 cc 后的字符 全部截取
//如果找不到 则全部截取
${变量名##*cc} //截取 最后一次出现CC 后所有的字符
//如果找不到 则全部截取
${变量名%cc}
${变量名%%cc}
数组
c语言中 有数据类型 长度限制 一维 二维 多维
shell中 是没有数据类型 长度限制 维数的限制的
-
定义
连续赋值 arr=(数值1 空格 数值2 ... 数值n) 不连续赋值 arr=([0]=1 空格 [1]=2 空格 [5]=999) //赋值次序可以错乱 单一元素赋值 arr[n]=新值 未赋值的元素 为 空
-
数组的访问
数组成员访问必须用
${}单一元素访问
${arr[下标值]}全部访问
${arr[@]} 或 ${arr[*]} -
获取数组元素个数
${#arr[*]}未被赋值的元素 不在计数范围内 只计算赋值的元素个数 -
获取数组元素字符个数
${#arr[下标值]}
-
数组尾部追加新元素 arr=(${arr[@]} 新值)
-
数组元素终端赋值 read -a arr 赋值时 用 空格隔开 元素
运算符
shell中的运算符
shell 中所有的变量都是 字符串 字符串无法进行算数运算 如果想要进行算数运算 需要借助 特殊标识符 辅助完成
-
(()) :对整数进行运算 不支持浮点数 这个符号比较常用 ((表达式)) 用法1. ((var2)) 用法2. ((var1+((var2))
自增 ((var1++))
echo $`((++var1)) #前++ echo` $((++var1)) #后++//不可以有如下操作
(($(var1++))) echo ((${var1++})) -
幂运算 **
((变量名=2**3)) -
关系运算: ((变量名 关系运算符 变量名))
-
逗号运算: ((变量1,变量2,变量3,...变量n)) 取 变量n
-
$[]:$[表达式]不支持浮点运算
$[表达式1,表达式2,...表达式n] 取最右侧 表达式n 结果 与 (()) 基本相同 -
expr:算数运算
运算算数书写要注意: 运算符与 变量名之间 需要加 空格
运算两个数的乘积 需要 用到转义符 *
expr 参与运算的变量 必须要加 $
expr $var++ 自增 不支持 以字符串处理
sum=expr $((var++))
-
expr:关系运算 关系运算 也需要对关系运算符 加转义符 \
-
expr:字符串操作 expr 字符串变量名1字符串变量名2 //将两个变量拼接
字符串匹配: expr match:
expr match $字符串变量 "要匹配的字符串"
var="www.Hqyj.com"
expr match $var "www"
返回 4
返回的字符串匹配字符的个数 expr match 匹配字符串是从 头开始匹配 如果第一个 不匹配则不进行后边的匹配
var="www.Hqyj.com"
expr match $var "H"结果返回 0 字符串截取:
expr substr:
expr substr $截取字符串变量 第几个开始截取 空格 截取个数
var="www.Hqyj.com"
expr substr $var 3 4
执行结果 w.Hq
expr substr 截取计数 是从 1 开始计数的
字符串位置查找:
expr index:
expr index $字符串变量 “获取具体的字符串”
var="www.Hqyj.com"
expr index $var "Hqyj"
执行结果 5 因为 Hqyj 在整个字符串的第 5个字符开始出现
字符串长度获取:
expr length
expr length $字符串变量
var="www.Hqyj.com"