shell【1】

221 阅读3分钟

“这是我参与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. ((var+var+var2)) 用法2. ((var1+var2))用法3.var3=var2)) 用法3. var3=((var+var+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"