运维SHELL

361 阅读4分钟
  • CI:持续集成

    持续不断地把每天代码集成起来,测试代码整体的可运行性

  • CD:持续交付

    根据用户体验等BUG反馈,持续进行版本迭代

1. shell基础

1.1 脚本基础

shell就是在操作系统和应用程序之间的一个命令翻译工具。

  • shell可用逐行输入命令、逐行进行确认执行,也可用脚本方式进行执行(常用)
  • 脚本执行方式是将shell命令写入脚本文件中,然后运行脚本文件

1.2 脚本规范

windows以[.sh]文件结尾,Linux通过vi/vim,且脚本是从上到下依次执行命令

#!/bin/bash
# 这是临时shell脚本
echo 'nihao'
  • 运行脚本的方式主要有相对路径和绝对路径,工作中主要用到绝对路径,即:

bash /path/to/script-name 或 /bin/bash /path/to/script-name (强烈推荐使用)

也可用其它方式

/path/to/script-name		或	./script-name	(当前路径下执行脚本)
source script-name			或	. script-name	(注意“.“点号)

1.3 shell中的变量

shell中变量主要分为本地变量、全局变量、内置变量

  • 本地变量又分为普通变量和命令变量

    • 本地变量:

    变量名="变量值"

      重点:如果变量值范围内,有可以解析的变量A,那么首先解析变量A,将A的结果和其他内容组合成一个整体,重新赋值给变量B,数字不加引号,其他默认加双引号。
    
    • 命令变量:

    变量名=$(命令)

    执行流程:

      1、执行$()范围内的命令
      2、将命令执行后的结果,赋值给新的变量名A
    
  • 全局变量:

    export 变量=值

    可用env查看所有全局变量,也可用env | grep 变量名 查看该全局变量

  • 内置变量

符号意义
$0获取当前执行的shell脚本文件名,包括脚本路径
$n获取当前执行的shell脚本的第n个参数值,n=1..9,当n为0时表示脚本的文件名,如果n大于9就要用大 括号括起来${10}
$#获取当前shell命令行中参数的总个数
$?获取执行上一个指令的返回值(0为成功,非0为失败)
  • 查看变量和取消变量

    • 查看变量:

    "${变量名}"

    当外部存在双引号时 echo " dsa dsafsa dsafsa ${变量名} f "

    • 取消变量: unset 变量名

1.4 字符串截取和默认值

  • 字符串截取格式:${变量名:起始位置:截取长度}
示例:
${file:0:5}		从第1个字符开始,截取5个字符
${file::5}			从第1个字符开始,截取5个字符
${file:5:5}		从第6个字符开始,截取5个字符
${file:5}			从第6个字符开始,截取后面所有的字符
${file:0-5}		从倒数第5个字符开始,截取后面所有的字符
${file:0-6:3}		从倒数第6个字符开始,截取之后的3个字符
  • 默认值格式:变量名:默认值{变量名:-默认值} 或 {变量名:+默认值}
    #!/bin/bash
	# 套餐选择演示
	a="$1"
	echo "您选择的套餐是: 套餐 ${a:-1}"
    
    运行结果:a无参数就默认输出套餐1,有参数输出该套餐数
  • ${变量名:-默认值}

    变量a如果有内容,那么就输出a的变量值

    变量a如果没有内容,那么就输出默认的内容

    #!/bin/bash
	# 结婚年龄选择演示
	a="$1"
	echo "法定结婚年龄是: ${a:+22}"
  • ${变量名:+默认值}

    不管a有没有值都输出默认内容

2. shell 进阶

2.1 测试语句

  • test 条件表达式
  • [ 条件表达式 ],中括号内两边必须有空格

2.2 逻辑表达式

  • 命令1 && 命令2

    如果命令1执行成功,那么我才执行命令2

    如果命令1执行失败,那么命令2也不执行

  • 命令1 || 命令2

    如果命令1执行成功,那么命令2不执行

    如果命令1执行失败,那么命令2执行

2.3 文件表达式

  • -f 判断输入内容是否是一个文件

示例:

# [ -f weizhi.sh ] && echo "是一个文件"
是一个文件
# [ -f weizhi.sddh ] || echo "不是一个文件"
  • -d 判断输入内容是否是一个目录
  • -x 判断输入内容是否可执行

2.4 数值操作符

n1 -eq n2 相等

n1 -gt n2 大于

n1 -lt n2 小于

n1 -ne n2 不等于

  • 字符串比较

str1 == str2 str1和str2字符串内容一致

str1 != str2 str1和str2字符串内容不一致,!表示相反的意思

2.5 if 语句

语法格式:

if [ 条件 ]
then
  	指令1
elif [ 条件2 ]
then
 	指令2
else
 	指令3
fi

2.6 case语句

语法格式:

case 变量名 in
   值1)
      指令1
         ;;
   值2)
      指令2
         ;;
   值3)
 	  指令3
         ;;
esac

注意:
首行关键字是case,末行关键字esac
选择项后面都有 )
每个选择的执行语句结尾都有两个分号;

case语句较于if多条件时,相对简洁,代码量少,容易看清

2.7 for循环语句

语法格式:

#!/bin/bash
# for语句的使用示例,遍历文件
for i in $(ls /root)
do
  echo "${i}"
done

2.8 while语句

语法格式:

while 条件
do
   执行语句
done

注意:
条件的类型:
命令、[[ 字符串表达式 ]]、(( 数字表达式 ))

只要满足条件一直执行下去

2.9 until语句

语法格式:

until 条件
do
   执行语句
done
注意:
条件的类型:
命令、[[ 字符串表达式 ]]、(( 数字表达式 ))

只要条件不满足就一直循环下去

3. 复杂流程控制语句

函数就是我们的复杂流程控制语句

3.1 简单函数

函数格式:

函数名(){
	函数体
}
	调用函数:
函数名

注:不调用函数不生效

示例:脚本函数传参

#!/bin/bash
# 函数传参演示

# 定义传参数函数
dayin(){
  echo "wode mingzi shi $1"
}

# 函数传参
dayin $1