shell script总结大全

sheel script

shell脚本语法规范

如何书写一个shell脚本

  • 文件没有扩展名的概念,最好以.sh结尾,最好在30个字符以内

  • #代表注释,#!是特例,定义脚本在哪个路径运行

  • 脚本的说明字段

    • 运行解析路径#!/bin/bash
    • 作者#Author:guying
    • 时间#Created Time
    • 版本号#Release:1.0
    • 脚本描述#Script Description:nginx install script
    • 如何自动生成???
  • 脚本组成

    • #解释环境:例如#!/user/bin/env或者bash |python|perl
    • #注释说明
    • #执行代码
  • 如何运行一个shell脚本

    • 给执行权限 ./文件名
    • 解释器直接运行,不需要给权限 bash 文件名
    • 解释环境有很多种,例如bash sh ,用cat /etc/shells查看
  • shell中的特殊符号

    • ~ 代表家目录,# cd ~
    • ! 执行历史命令 !!执行上一条命令
    • $ 变量中取内容符
          • % 对应数学运算,加减乘除取余数
    • & 后台执行
      • shell中的通配符 匹配所有
    • ? shell中的通配符 ,匹配除了回车键以外的一个字符
    • ; 分号可以在shell中一行执行多个命令,命令之间用分号分隔
    • | 管道
    • \ 转义字符
    • 反引号 ,命令中执行命令 echo ”today is date+%F
    • ’ ’ 单引号,脚本中字符要用单引号引起来,但是不同于双引号的是,单引号不解释变量
    • " " 双引号,脚本中出现的字符串可以用双引号引起来
  • shell在管道中的应用

    • 用于拼接命令,通过管道可以执行一些复杂的数据处理操作

shell中的运算

  • 算术运算(四则运算)

          • % 对应数学运算,加减乘除取余数
      • 运算命令

        • 整形运算

          • -expr只能做整数运算
          • -let只能做整数运算,而且运算元素必须是变量,无法直接对整数做运算let sum=1+1
          • -$(( ))双小圆括号里也可以做数学运算
          • -bc计算器
      • 浮点运算

        • -bc采用命令组合的方式实现,echo “scale=N;数学表达式”|bc,例如echo ”scale=2;100*3“|bc
  • 比较运算

    • 整形比较运算

      • 精确比较

        • -eq等于
        • -gt大于
        • -lt小于
      • 模糊比较

        • -ge大于或等于
        • -le小于或等于
        • -ne不等于
  • 字符串比较运算

    • =等于返回true
    • ! =不等于返回ture
    • -n 检查字符串的长度是否大于0,不为0返回true
      • z 检查字符串的长度是否为0,为0返回true
    • $ 检测字符串是否为空,不为空就返回true
  • 逻辑运算

    • 使用场景

      • 多条件同时判断
    • 逻辑运算符

      • && 真真为假、真假为假、假假为假
      • || 真真为真、真假为真、假假为假
      • ! 非假为真、非真为假
    • 逻辑与或的短路运算

      • 逻辑与中靠前的条件中出现了假,后面的就不再判断了,因为已经是假的了
      • 逻辑或中靠前的条件中出现了真后面的就不再往后判断了,结果已经为真了
  • 文件判断(文件类型、权限、新旧判断)

    • test判断命令

      • 检测文件类型和比较运算

      • teat [命令选项] 表达式

        • 命令选项

          • -d 检查文件是否存在且为目录,若存在且为目录则为真
          • -e 检查文件是否存在,存在则为真
          • -f 检查文件是否存在且为文件,若存在且为文件则为真
          • -r 检查文件是否存在且可读
          • -s 检查文件是否存在且不为空, 如果文件存在且至少有一个字符则为真
          • -w 检查文件是否存在且可写,可写则为真
          • -x 检查文件是否存在且可执行,可执行则为真
          • -O 检查文件是否存在且被当前用户拥有
          • -G 检查文件是否存在且默认组为当前用户组
          • -nt file1 -nt file2检查file1是否比file2新
          • -nt file1 -ot file2检查file1是否比file2旧
          • -ef file1 -ef file2检查file1和file2是否为同一个文件,判断依据的是i节点
          • -b 检查文件是否为块设备文件,若文件存在且为块文件则为真
          • -c 检查文件是否为字符设备文件,如果文件存在且为字符特殊文件则为真
          • -g 检测文件是否设置了SGID位
          • -k 检测文件是否设置了
  • 布尔运算符

    • -o

    • -a

脚本的运行和退出

- 运行

	- bash 文件名

- 退出

	- exit NUM推出脚本,释放系统资源,NUM代表一个整数,代表返回值。

为脚本设置可执行权限,并执行脚本

  • $ chmod +x test.sh

  • $ ./test.sh 1 2 3

    • 输出第1、2、3个参数

格式化输出

echo命令

  • 在显示器上显示一段文字

  • echo [-ne] [字符串]

  • 命令选项

    • -n 不要在最后自动换行
    • -e 若字符串中出现以下的字符,则特别加以处理,而不会将它当成一般文字输出。
  • 转义字符

    • \b 删除前一个字符
    • \c 最后不加上换行符号
    • \n 换行且光标移至行首
    • \t 插入tab符号
    • \f 换行但是光标仍旧停留在原来的位置

shell的基本输入、输出

read命令 读取

  • 命令选项

    • -p打印信息
    • -t限定时间
    • -s不回显
    • -n 输入字符个数

echo命令

  • 显示普通字符串的时候,双引号可以省略

  • 显示转义字符

    • echo “”\我是古颖"" 结果为"我是古颖"

      • 双引号也可以省略
  • 显示变量

    • read name
    • echo “$name It is a test”
  • 显示换行

    • echo -e “OK! \n” # -e 开启转义
  • 显示不换行

    • echo -e “OK! \c” # -e 开启转义 \c 不换行
  • 显示结果定向至文件

    • echo “It is a test” > myfile
  • 原样输出字符串,不进行转义或取变量(用单引号)

    • echo ‘$name"’
  • 显示命令执行结果

    • echo date 这里是单引号

printf命令

  • 语法:printf format-string [arguments…]

    • format-string: 为格式控制字符串
    • arguments: 为参数列表
  • 格式替代符

    • %s

      • 输出一个字符串
    • %c

      • 输出一个字符
    • %d

      • 整形输出
    • %f

      • 输出实数
    • %-10s

      • 指一个宽度为 10 个字符(- 表示左对齐,没有则表示右对齐),任何字符都会被显示在 10 个字符宽的字符内,如果不足则自动以空格填充,超过也会将内容全部显示出来。
    • %-4.2f

      • 指格式化为小数,其中 .2 指保留2位小数。
  • printf的转义序列

shell字符串

单引号

  • 单引号里的任何字符都会原样输出,单引号中的变量是无效的
  • 单引号内的字符串中不能出现单独一个的单引号,可成对出现,对单引号使用转义字符后也不行

双引号

  • 双引号中可以有变量
  • 双引号中可以出现转义字符

拼接字符串

  • 使用双引号拼接!!!

string=“guying is so beautiful”

  • 获取字符串长度

    • echo $(#string) 输出为4
  • 提取子字符串

    • 从字符串第二个字符开始截取4个字符

      • echo ${string:1:4} 输出为 uyin
  • 查找子字符串

    • 查找字符i或g的位置(哪个字母先出现,就计算哪个)

      • echo expr index "$string" ig 输出为1

        • 注意是反引号

shell数组

定义数组

  • 用括号表示数组,数组元素用空格符号分开

    • array_name=(value0 value 1 value2)

    • 或者单独定义数组的各个分量:

      • array_name[0]=value0

读取数据

  • 读取元素值

    • ${数组名[下标]}

      • valuen=${array_name[n]}
  • 使用@获取数组的所有元素

    • echo ${array_name[@]}

获取数组的长度(与获取字符串的方法相同)

  • 获取数组元素的个数

    • length=$(#array_name[@]}
    • 或者length=${#array_name[*]}
  • 获取数组单个元素的长度

    • length=${#array_name[n]}

shell注释

#开头就是注释,除#!

多行注释

  • :<<EOF
  • 中间是注释内容
  • EOF

shell传递参数

  • ∗ 和 *和 @的区别

    • 相同

      • 都是引用的所有参数
    • 不同

      • 只有在双引号中体现出来。假设在脚本运行时写了三个参数 1、2、3,,则 " * " 等价于 “1 2 3”(传递了一个参数),而 “@” 等价于 “1” “2” “3”(传递了三个参数)

shell流程控制

if else

  • 语法格式

    • if then elif then else fi(换行写)
    • if then else fi
    • if then fi

for循环

  • 语法格式

    • for
    • do
    • done

while循环

  • 用于不断执行一系列命令,也用于从输入文件中读取数据

  • 语法格式

    • while
    • do
    • done

until循环

  • 执行一系列命令直至条件为 true 时停止,与 while 循环在处理方式上刚好相反

  • 语法格式

    • untiil
    • do
    • done

多选择语句case•••esac

  • 每个 case 分支用右圆括号开始,用两个分号 ;; 表示 break,即执行结束,跳出整个 case … esac 语句

跳出循环

  • break命令

    • 跳出所有循环(终止执行后面的所有循环)
  • continue命令

    • 仅仅跳出当前循环

shell函数

可以带function fun() 定义,也可以直接fun() 定义,不带任何参数

函数参数

  • $1 为第一个参数
  • $2为第二个参数

shell输入输出重定向

重定向命令列表

输出重定向

  • command1 > file1

    • 执行command1然后将输出的内容存入file1。

输入重定向

  • command1 < file1

    • 从键盘获取输入的命令会转移到文件读取内容

shell文件包含

. filename # 注意点号(.)和文件名中间有一空格

或source filename

创建两个脚本,test1.sh和test2.sh,当test2.sh包含test1.sh,执行test2.sh时,需要给test2.sh添加可执行权限,被包含的test1.sh不需要添加可执行权限

  • $ chmod +x test2.sh
  • $ ./test2.sh

XMind: ZEN - Trial Version

猜你喜欢

转载自blog.csdn.net/weixin_44378053/article/details/113741118