阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

Linux基础教程之shell脚本使用入门

148次阅读
没有评论

共计 10147 个字符,预计需要花费 26 分钟才能阅读完成。

1、编程基础
  •   程序:指令 + 数据
  •   程序编程风格:
                        过程式:以指令为中心,数据服务于指令
                        对象式:以数据为中心,指令服务于数据
  •   shell 程序:提供了编程能力,解释执行
2、程序的执行方式
  •         计算机:运行二进制指令
  •         编程语言:
                    低级:汇编
                    高级:
                             编译:高级语言– > 编译器–> 目标代码
                                     C,C++,C#,Go
                             解释:高级语言–> 解释器–> 机器代码
                                shell,perl , Python , JAVA
                                JavaScript , ruby ,PHP
3、编程基本概念
  •        编程逻辑处理方式:
                 顺序执行
                 循环执行
  •        shell 编程 : 过程式、解释执行
                 编程语言的基本结构:
                   各种系统命令的组合
                   数据存储:变量、数组
                         表达式:a+b
                   语句:if
4、shell 脚本基础
  •       shell 脚本:
                包含一些命令或声明,并符合一定格式的文本文件
  •       格式要求:首行 shebang 机制
                #!/bin/bash
                # ! /usr/bin/Python
                #!/usr/bin/perl
  •       shell 脚本的用途有:
                >   自动化常用命令
                >   执行系统管理和故障排除
                >   创建简单的应用程序
                >   处理文本或文件
5、创建 shell 脚本
  •       第一步: 使用文本编辑器来创建文本文件
                >  第一行必须包括 shell 声明序列:#!
                #!/bin/bash
                > 添加注释
                    注释以 #开头
  •       第二步:运行脚本
                > 给予执行权限,在命令行上指定脚本的绝对或相对路径
                > 直接运行解释器,将脚本作为解释器程序的参数运行
6、shell 脚本示例
      #!/bin/bash
      #Author :Li
      #Version : 1.0
      #Date : 2017-04-01
      #Description :The script displays system information
       echo”Greetings.The date and time are $(date)”
       echo“Your working directory is : $(pwd)”
Linux 基础教程之 shell 脚本使用入门

Linux 基础教程之 shell 脚本使用入门

7、脚本调试
  • 检测脚本中的语法错误
         bash -n /path/to/some_script
  • 调试执行
         bash -x /path/to/some_script
8、变量
  • 变量:暂时存放数据的地方,一个具有名称的内存地址空间。
          数据存储方式:
                          字符:
                          数值:整形,浮点型
  • 变量:变量类型
          作用:
                  1、数据存储格式
                  2、参与的运算
                  3、表示的数据范围
          类型:
                   字符
                   数值:整形、浮点型
  • 强类型:变量不经过强制转换,它永远是这个数据类型,不允许隐式的类型转换。一般定义变量时必须指定类型参与运算必须符合类型要求;调用未声明变量会产生错误
                   如  java,c#
  • 弱类型:语言的运行时会隐式做数据类型转换。无须指定类型,默认均为字符型;
          参与运算会自动进行隐式类型转换;变量无须事先定义可直接调用
          如:bash 不支持浮点数,php
  • 变量命名法则:
          1、不能使程序中的保留字:例如 if,for
          2、只能使用数字、字母及下划线,且不能以数字开头
          3、见名知义
          4、统一命名规则:驼峰命名法
  • 变量的命名规范
          > 使用英文字母, 数字及下划线组成;
          > 开头第一个字母不能使用数字
          >Beijing
          >BEIJING
          >BeiJing
          >Bei_Jing
          >_Bei_Jing
9、bash 中变量的种类
  • 根据变量的生效范围等标准:
           本地变量(全局变量):生效范围为当前 shell 进程; 对当前 shell 之外的其它 shell 进程,包括当
           前 shell 之外的其它 shell 进程,包括当前 shell 的子 shell 进程均无效
           环境变量:生效范围为当前 shell 进程及其子进程
           局部变量(私有变量):生效范围为当前 shell 进程中某代码片段(通常指函数)
           位置变量:$1,$2,…来表示,用于让脚本在脚本代码中调用通过命令行传递给它的参数
           特殊变量:$?,$0,$*,$@,$#,$$
10、本地变量
  • 变量赋值:name=’value’
  • 可以使用引用 value:
          (1)可以是直接字串;name=“root”
          (2)变量引用:name=”$USER”
          (3)命令引用:name=`COMMAND`  name=$(COMMAND)
  • 变量引用:${name}  $name
“”:弱引用,其中的变量引用会被替换为变量值
”:强引用,其中的变量引用不会被替换为变量值,而保持原字符串
  • 显示已定义的所有变量:set
  • 删除变量:unset name
11、环境变量
  • 变量声明、赋值:
        export name=VALUE
        declare -x name=VALUE
  • 显示所有环境变量:
           env,printenv,export,declare -x,set
  • 删除:unset name
  • bash 有许多内建的环境变量:PATH ,SHELL ,USRE,UID,
          HISTSIZE,HOME,PWD,OLDPWD,HISTFILE
12、环境变量
  • $PATH 命令的搜寻路径
  • $OLDPWD 前一个工作目录
  • $LANG 目前的工作语系
  • $BASH bash 的完整路径名
  • $BASH_VERSION Bash 的版本
  • $HISTCONTROL 控制指令是否存入历史文件中
  • $OSTYPE 显示系统类型
  • $MAIL 存放邮件的文件
  • $MAILCHECK 多久检查一下邮件
  • $PWD 当前路径
  • $SSH_TTY 当前登录的 TTY
  • $SHLVL 当前 shell 在第几层
  • $RANDOM 随机数
13、只读和位置变量
  • 只读变量:只能声明,但不能修改和删除
          > 声明只读变量:
          readonly name
          declare -r name
          > 查看只读变量:
          readonly -p
  • 位置变量:在脚本代码中调用通过命令行传递给脚本的参数
           $1,$2, ….: 对应第 1、第 2 等参数,shift [n]换位置
           $0: 命令本身
           $*: 传递给脚本的所用参数,全部参数合为一个字符串
           $@: 传递给脚本的所有参数,每个参数为独立字符串
           $#: 传递给脚本的参数的个数
                 $@ $* 只在被双引号包起来的时候才会有差异
           set — 清空所有位置变量
14、算术运算
  • bash 中的算术运算:help let
          +,-,*,/,% 取模(取余),**(乘方)
          实现算术运算:
          (1)let num= 算术表达式 let r=9+9
          (2)var=$[算术表达式]     r=$[9+9]
          (3)var=$((算术表达式))   r=$((9+9))
          (4)外部命令   expr    expr  8+3
          (5)declare -i  var = 数值 declare -i r=9+9
          (6)echo‘算术表达式’| bc    echo“8+8”| bc
  • 乘法符号有些场景中需要转义,如 *
  • bash 有内建的随机数生成器:$RANDOM(0-32767)
           echo $[$RANDOM%50]:0-49 之间随机数
  • 思考:
  • unset i
  • echo $((12+$i))是否可以执行
15、赋值
  • 增强型赋值:
            +=,-=,*=,/=,%=
  • let varOPERvalue
           例如:let count+=3
                     自加 3 后自赋值
  • 自增,自减:
           let var+=1
           let var++
           let var-=1
           let var–
Linux 基础教程之 shell 脚本使用入门
16、逻辑运算
  • true,false
          1,0
  • 与:
          1 与 1 =1
          1 与 0 =0
          0 与 1 =0
          0 与 0 =0
  • 或:
          1 或 1 =1
          1 或 0 =1
          0 或 1 =1
          0 或 0 =0
  • 非:!
!1=0
!0=1
  • 短路与
        第一个为 0,结果必定为 0
        第一个为 1,第二个必须要参与运算
  • 短路或
        第一个为 1,结果必定为 1
        第一个为 0,第二个必须要参与运算
17、退出状态
  • 进程使用退出状态来报告成功或失败
         > 0 代表成功,1-255 代表失败
         > $? 变量保存最近的命令退出状态
  • 例如:
          $ ping  -c1  -W1  hostdown  &>  /dev/null
          $ echo $?
18、退出状态码
  • bash 自定义退出状态码
         exit [n]: 自定义退出状态码
         注意:退出中一旦遇到 exit 命令,脚本会立即终止;终止退出状态取决于 exit 命令后面的数字
         注意:如果未给脚本指定状态码,整个脚本的退出状态码取决于脚本中执行的最后一条命令的
                   状态码
19、条件测试
  • 判断某需求是否满足,需要由测试机制来实现
     专用的测试表达式徐奥由测试命令辅助完成测试过程
  • 评估布尔声明,以便用在条件性执行中
         > 若真,则返回 0
      .  > 若假,则返回 1
  • 测试命令:
         >  test EXPRESSION
         >  [EXPRESSION]
         >  [[ EXPRESSION] ]
              注意:EXPRESSION 前后必须有空白字符
20、条件性的执行操作符
  • 根据退出状态而定,命令可有条件地运行
           >  && 代表条件性的 AND THEN
           >  ||   代表条件性的 OR ELSE
  • 例如:
       $ grep -q no_such_uesr  /etc/passwd 
       | | echo‘No such user’
       No such user
       $ ping  -c1  -W2  station1  &>  /dev/null 
          > &&  echo“station1  is  up”
          >  ||  (echo‘station1 is unreachable’: exit1)
          station1  is  up
21、test 命令
  • 长格式的例子:
           $ test“$A”==“$B”&&  echo“Strings  are  equal”
           $ test“$A”-eq“$B”
             &&  echo“Integers are equal”
  • 简写格式的例子:
          $  [“$A”==“$B”]  &&  echo“Strings are equal”
          $  [“$A”-eq“$B”]  &&  echo“Integers are equal”
22、bash 的测试类型
        -gt: 是否大于
        -ge: 是否大于等于
        -eq: 是否等于
        -ne: 是否不等于
        -lt: 是否小于
        -le: 是否小于等于
23、bash 的测试类型
  • 字符串测试
                     ==:是否等于;
                      >  : ascii 码是否大于 ascii 码
                      <  :  是否小于
!=:是否不等于
                    =~:左侧字符串是否能够被右侧的 PATTERN 所匹配
                            注意:此表达式一般用于 [[]] 中;扩展的正则表达式
                        -z“STRING”: 字符串是否为空,空为真,不空为假
                        -n“STRING”: 字符串是否不空,不空为真,空为假
  • 注意:用于字符串比较时的用到的操作数都应该是使用引号
24、文件测试
  • 存在性测试
          -a FILE: 同 -e
          -e FILE: 文件存在性测试,存在为真,否则为假
  • 存在性及类别测试
          -b FILE:  是否存在且为块设备文件
          -c FILE:  是否存在且为字符设备文件
          -d FILE:  是否存在且为目录文件
          -f  FILE:  是否存在且为普通文件
          -h FILE 或 -L FILE : 存在为符号链接文件
          -p FILE: 是否存在且为命名管道文件
          -S FILE:  是否存在且为套接字文件
  • 文件权限测试:
          -r FILE: 是否存在且可读
          -w FILE: 是否存在且可写
          -x FILE : 是否存在且可执行
  • 文件特殊权限测试:
          -u FILE : 是否存在且拥有 suid 权限
          -g FILE: 是否存在且拥有 sgid 权限
          -k FILE: 是否存在且拥有 sticky 权限
25、组合测试条件
  • 第一种方式:
          COMMAND1 && COMMAND2 并且
          COMMAND1 | |  COMMAND2 或者
!COMMAND 非
           如:[[-r FILE]] && [[-w FILE]]
  • 第二种方式:
         EXPRESSION1 -a EXPRESSION2 并且
         EXPRWSSION1 -o EXPRESSION2  或者
!EXPRESSION
“!”最高,“-a”次之,”-o”最低。
        示例:
                # [-z“$HOSTNAME”-o $HOSTNAME“==“localhost.localdmain”] && hostname
                   www.magedu.com
                # [-f  /bin/cat -a -x /bin/cat] && cat /etc/fstab
26、使用 read 命令来接受输入
  • 使用 read 来把输入值分配给一个或多个 shell 变量:
            -p  指定要显示的提示
            -s  静默输入
            -n  N 指定输入的字符长度 N
             -d‘字符‘输入结束符
             -t  N  TIMEOUT 为 N 秒
             read  从标准输入中读取值,给每个单词分配一个变量所有剩余单词都被分配给最后一个变
                      量
             read -p“Enter a filename:”FILE
27、bash 如何展开命令行
  • 把命令行分成单个命令词
  • 展开别名
  • 展开大括号的声明({})
  • 展开波浪符声明(·)
  • 命令替换 $()   和“)
  • 再次把命令行分成命令词
  • 展开文件通配(*、?、[abc]等等)
  • 准备 I / O 重导向(<、>)
  • 运行命令
28、防止扩展
  • 反斜线()会使随后的字符按愿意解释
           $  echo  Your  cost:  $5.00
           Your  cost  :  $5.00
  • 加引号来防止扩展
           > 单引号(’)防止所有扩展
           > 双引号(”)也防止所有扩展,但是一下情况例外:
              >$(美元符号)    —  变量扩展
              >`  (反引号)        —  命令替换
              >(反斜线)—   禁止单个字符扩展
              > !(叹号)    —  历史命令替换
29、bash 的配置文件
  • 按生效范围划分,存在两类:
  • 全局配置:
           /etc/profile
           /etc/profile.d/*.sh
           /etc/bashrc
  • ~/.bash_profile
  • ~/.bashrc
30、shell 登录两种方式
  • 交互式登录:
      (1) 直接通过终端输入账号密码登录;
      (2)使用”su – UserName”切换的用户
         执行顺序:
     /etc/profile — > /etc/profile.d/*.sh — >
~/.bash_profile — > ~/ .bashrc — > /etc/bashrc
  • 非交互式登录:
       (1)su UserName
       (2)图形界面下打开的终端
       (3)执行脚本
      执行顺序:
              ~/ .bashrc –> /etc/bashrc –> /etc/profile.d/*.sh
31、Profile 类
  • 按功能划分,存在两类:
           profile 类和 bashrc 类
  • profile 类:为交互式登录的 shell 提供配置
           全局:/etc/profile, /etc/profile.d/*.sh
           个人 : ~/.bash_profile
           功用:
           (1)用于定义环境变量
           (2)运行命令或脚本
32、Bashrc 类
  • bashrc 类:为非交互式和交互式登录的 shell 提供配置
           全局:/etc/bashrc
           个人:~/ .bashrc
           功用:
           (1) 定义命令别名和函数
           (2) 定义本地变量
33、编辑配置文件生效
  • 修改 profile 和 bashrc 文件后需生效
            两种方法:
          1 重新启动 shell 进程
          2 . 或 source
           例:
                 .~/.bashrc
34、Bash 退出任务
  • 保存在~/.bash_logout 文件中(用户)
  • 在退出登录 shell 时运行
  • 用于
              > 创建自动备份
              > 清除临时文件
35、变量高级操作
  • 测试变量存在性
  • 字符串切片
           1 ${变量:位置起点}
                             由指定的位置开始,截取字符串到字符串结束
                eg:MYNAME=”liangchenye”
                     substr=${MYNAME:4}
           2 ${变量:位置起点:长度}
             eg:MYNAME=”liangchenye”
                     substr2=${MYNAME:4:6}
  • 计算字符串长度
           >${# 变量名称}
           > 传回变量值的字符串长度
                           filename=”/usr/sbin/ntpd”
                           echo ${#filename}
             PS: 另外一种方法:
             expr  length“$filename”
  • 由前面 (最左边) 开始,对比变量值,删除“最短相符合的字符串”
           > ${变量 #样式}
           > filename=”/usr/sbin/ntpdate”
               echo ${filename#/*/}
          由前面对比,删除最长的
              ${变量 ## 样式}
          > filename=”/usr/sbin/ntpdate”
               echo ${filename##/*/}
  • 由后面对比,删最短的
           >${变量 % 样式}
           >filename=”/usr/sbin/ntpd”
           > echo ${filename%/*}
           由后面对比,删最长的
           ${变量 %% 样式}
            domainname=”www.178Linux.com”
             echo ${domainname%%.*}
  • 只替换第一个对比符合的字符串
           > ${变量 / 样式 / 字符串}
           >  name=”liangchenye”
           > echo ${name/liang/wang}
  • 替换全部对比符合的字符串
           > ${变量 // 样式 / 替换字符串}
           > name=”zhaoritianzhaoritian”
           > echo  ${name//zhao/ye}
  • 把对比符合的字符串删除
          > 只删除一个 ec
          > ${变量 / 样式 /}
          > name=“liangchenye”
          > echo ${name//zhao/}
36、变量操作:测试存在值及空值
  • ${待测变量 - 默认值}
           > 若变量不存在,则符合判断,传回默认值
           > unset myname
           >  echo  ${myname-“fuerkang”}
  • ${待测变量:= 默认值}
           > 若变量号不存在或其值为空,则符合判断,传回默认值
           > unset myneme
           > echo  ${myname :=“fuerkang”}
37、循环判断 if
  • 判断之 if
         > 结构
         > 书写格式

Linux 基础教程之 shell 脚本使用入门

38、循环判断 for
  • 循环之 for
        > 书写格式
        > c 类型
  • 循环中断
        > continue
        > break
39、循环判断  while  until
  • 循环之 while
          > 书写格式
  • 循环之 until
          > 书写格式
  • while 和 until 区别
          >while 为真执行后面代码段
          >until   为真是停止执行
  • 循环中断
          >continue
          >break
  • while,until 和 for 的区别
            >for  可预见
            > while,until 不可预见
Linux 基础教程之 shell 脚本使用入门
循环判断  case
  • 判断之 case
          > 书写格式
          > 常用使用场景
Linux 基础教程之 shell 脚本使用入门
40、函数
  • 函数
            > 定义
            > 调用
            > 作用:实现代码重用
            > 位置函数作为参数
Linux 基础教程之 shell 脚本使用入门
41、数组
  • 声明
           >a=(1 2 3 4)
           >a[0]=1  a[1]=2
           >a=([0]=1 [1]=2 [3]=4)
  • 显示数组所有元素
           .>echo  ${a[*]}
            >echo  ${a[@]}
  • 显示数组所有索引
            >echo  ${!a[@]}
  • 使用索引显示元素
            >echo ${a[0]}
  • 数组元素个数
            >echo ${#a[@]} 或 echo ${#a[*]}
正文完
星哥玩云-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2022-12-03发表,共计10147字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中