• RHCE---Shell基础 2



    前言

    前文初步介绍了shell脚本的基础知识,本章我们将通过引入一些新的知识和例题,学会完成一些简单的shell脚本编写。


    一.变量

    概述

           在shell脚本中,变量是一个可用于存储或检索值的名称。变量可以是数字、字符串或其他类型的数据。在shell脚本中,变量通常以美元符号($)开头,后跟变量名称。

    定义

    • 原则:直接使用,不需要变量声明
    • 格式:变量名=变量的值

    例 1:

    1. [root@server ~]# vim test2.sh
    2. #脚本抬头
    3. #!/bin/bash
    4. # 定义变量c
    5. c="hello world"
    6. # 定义路径
    7. bak_dir=/data/backup
    8. [root@server ~]# bash test2.sh
    9. hello world

    例2: 

    在shell脚本中,let命令用于执行整数运算,并将结果赋值给变量。可以理解为是一种执行算术运算的快捷方式。

    1. [root@timeserver ~]# bash test3.sh
    2. x=123
    3. let "x=x+1" #let:使shell脚本识别变量,不使用let时x会被识别为字符串
    4. y=$x
    5. echo "$y"
    6. [root@timeserver ~]#
    7. 124 #不加let 输出为 x+1
    •  = 前后不能收空格
    1. [root@server ~]# a= 3
    2. bash: 3: command not found...
    3. [root@server ~]# b =5
    4. bash: b: command not found...
    •  字符串类型建议使用双引好作为定界符引起,尤其是字符串中有空格
    1. [root@server ~]# stu_name=zhang san
    2. bash: san: command not found...
    3. [root@server ~]# stu_name="zhang san"
    4. [root@server ~]# stu_name='zhang san'

     自定义变量

    • 概念:上述以赋值形态形成的变量定义形式称为自定义变量

     查看变量:set 

    取消环境变量:unset 

    环境变量 

     概述:

        环境变量是操作系统中一个重要的概念,它用来存储一些在操作系统级别下用到的值,比如路径、用户名、密码等。在Linux系统中,环境变量存储在系统中的一个地方,每个终端都可以访问它们。

    一些常用的环境变量包括:

    1. PATH:用于指定可执行程序的搜索路径。
    2. HOME:指定当前用户的主目录。
    3. SHELL:指定当前用户使用的Shell程序。
    4. USER:指定当前用户的用户名。
    5. LANG:指定当前系统使用的语言环境。

    定义环境变量: 

    方法 1:export 环境变量=值

    方法 2 :变量名=值

                   export 变量名

    方法 3:declare  -x   变量名=值

    显示当前用户的环境变量:env  

    位置变量

     概念:当一条命令或脚本执行时,后面可以跟多个参数,可以使用位置变量来表示该参数

    1. [root@timeserver ~]# vim test3.sh
    2. echo "第2个位置参数时:$2"
    3. echo "第1个位置参数时:$1"
    4. echo "第4个位置参数时:$4"
    5. echo "所有位置参数时:$*"
    6. echo "位置参数个数时:$#"
    7. echo "当前进程的PID值:$$
    8. [root@timeserver ~]# bash test3.sh 1 2 3 4 5
    9. 第2个位置参数时:2
    10. 第1个位置参数时:1
    11. 第4个位置参数时:4
    12. 所有位置参数时:1 2 3 4 5
    13. 位置参数个数时:5
    14. 当前进程的PID值:36113

    常见的位置变量:

    • $0 : 脚本名
    • $1-$9 : 1-9个参数
    • ${10} :10以上的参数需要大花括号括起
    • $* : 所有参数
    • $@ : 所有参数
    • $# : 参数个数
    • $$ : 当前进程的PID
    • $! : 上一个后台进程的PID
    • $? : 上一个命令
    • 的返回值状态码,0为成功

    $*和$#区别

    • "$@"会把所有位置参数当成一个单独的字段 
    • "$*"会把所有位置参数当成一个整体(或者说当成一个单词 

    1. [root@server ~]# set -- I am test command
    2. [root@server ~]# for i in "$@"; do echo $i; done
    3. I
    4. am5
    5. test
    6. command
    7. [root@server ~]# for i in "$*"; do echo $i; done
    8. I am test command

     变量的赋值和作用域 

     read 命令

    概述:

    • read 命令从标准输入中读取一行,并把输入行的每个字段的值指定给 shell 变量
    • 量格式:read -参数 变量名
    • 参数
    1. -p “提示语句:” 屏幕打印出一行提示语句。
    2. -n数字:当输入的字符数目达到预定数目时,自动退出,并将输入的数据赋值给变量,如:-n1 , 只要接受到
    3. 一个字符就退出。只要按下一个字符进行回答,read命令立即接受输入并将其传给变量。无需按回车键
    4. -t 等待时间 :计时输入,使用read命令存在着潜在危险。脚本很可能会停下来一直等待用户的输入。如果
    5. 无论是否输入数据脚本都必须继续执行,那么可以使用-t选项指定一个计时器。-t选项指定read命令等
    6. 待输入的秒数。当计时满时,read命令返回一个非零退出状态
    7. -s :关闭回显,使read命令中输入的数据不显示在监视器上(实际上,数据是显示的,只是read命令将文本颜
    8. 色设置成与背景相同的颜色)常用格式:
    9. read 变量名
    10. read -p "提示信息:"   变量名

    例1:

    1. [root@server ~]# read -p "Enter Numbers: " num
    2. Enter Numbers: 9527
    3. [root@server ~]# echo $num
    4. 9527
    5. [root@server ~]# read -t 3 n1   # 不要输入内容,等待3秒后自动结束输入
    6. [root@server ~]# read -s -p "Enter your password: " passw
    7. Enter your password: [root@server ~]# echo $passw
    8. 123456
    9. [root@server ~]# echo $REPLY
    10. [root@server ~]# read
    11. 100
    12. [root@server ~]# echo $REPLY   # 当输入时没有指定变量接收,会默认存储到REPLY变量中
    13. 100
    14. # 一次性输入多个变量的值
    15. [root@server ~]# read t1 t2
    16. 12 35
    17. [root@server ~]# echo $t1 $t2
    18. 12 35

     面试题总结四种复制方法:

    1. 1.直接赋值:name="li si"
    2. 2.read命令: read name
    3. 3.使用位置参数($1 $2 $3…) : name=$1
    4. 4.命令输入:name=$(whoami)  

    变量和引号 

    1. 单引号(' '):单引号中的内容被视为纯文本,其中任何其他特殊字符(包括变量和命令替换)都会被视为普通字符。例如,单引号中的'$VAR'将被视为字符串'$VAR',而不是变量$VAR的值。
    2. 双引号(" "):双引号中的内容可以包含变量和命令替换,这些替换将被执行并被替换为其对应的值。双引号还可以用于转义特殊字符,例如$和\。
    3. 反引号/反撇号( 或者$()):在反引号或反撇号中的内容将被视为命令,该命令将被执行并返回其输出。该输出将被替换为反引号或反撇号中的内容。

    变量的作用域  

    全局变量:

    全局变量指的是在整个脚本中都可访问的变量。这些变量可以在脚本的任何位置进行声明和赋值,并且可以在整个脚本的任何地方使用。

    1. [root@server ~]# vim test5.sh
    2. #!/bin/bash
    3. func()   # 定义函数 1
    4. {
    5.        echo   "$v1"
    6.        v1=200
    7. } 2
    8. v1=100
    9. func #调用函数 3
    10. echo  "$v1" 4
    11. [root@server ~]# bash test5.sh
    12. 100
    13. 200
    14. #程序执行顺序:1-2之间为函数,首先装入内存,不调用,首先执行v1=100 接着调用函数
    15. #当函数被调用后:首先执行echo   "$v1" 输出V1 由于函数内部没有定义V1 则到函数外部
    16. #查找V1=100 输出100 接着执行V1=200,此时函数执行结束,接着执行echo  "$v1" 输出200

     局部变量:范围更小,仅限于某个程序段中,如:函数、shell等,通过local关键字定义

    1. # 上例修改
    2. [root@server ~]# vim test5.sh
    3. #!/bin/bash
    4. func()   # 定义函数
    5. {
    6.       local v3=200  # 使用local关键字声明为局部变量
    7. }
    8. func
    9. echo  "$v3"
    10. [root@server ~]# bash test5.sh
    11. #没有内容

     变量的运算符

    例 1:

    1. [root@server ~]# expr 1 + 1 # 注意+左右必须要有空格
    2. 2
    3. [root@server ~]# expr 1+1   # 否则原样显示
    4. 1+1
    5. [root@server ~]# a=1
    6. [root@server ~]# b=2
    7. [root@server ~]# expr $a + $b # 支持变量
    8. 3
    9. [root@server ~]# let num=1+2   # let+echo 等价于expr
    10. [root@server ~]# echo $num
    11. 3
    12. [root@server ~]# let num=1 + 2   # 注意let中运算符左右不能由空格
    13. -bash: let: +:语法错误: 需要操作数 (错误符号是 "+")
    14. [root@server ~]# echo $((1+2))
    15. 3
    16. [root@server ~]# echo $((5%3))
    17. 2
    18. [root@server ~]# echo $((3%5))
    19. 3
    20. [root@server ~]# echo $((1-5))
    21. -4
    22. [root@server ~]# echo $((2 * 5))   # 可以有空格
    23. 10
    24. [root@server ~]# echo $((5.2-5))   # 只支持整数运算
    25. -bash: 5.2-5:语法错误: 无效的算术运算符 (错误符号是 ".2-5")
    26. [root@server ~]# echo $[2+3]   # [] 等价于 (())
    27. 5
    28. [root@server ~]# echo $[2.5+3] # # 只支持整数运算
    29. -bash: 2.5+3:语法错误: 无效的算术运算符 (错误符号是 ".5+3")
    30. [root@server ~]# bc
    31. bc 1.07.1
    32. Copyright 1991-1994, 1997, 1998, 2000, 2004, 2006, 2008, 2012-2017 Free Software
    33. Foundation, Inc.
    34. This is free software with ABSOLUTELY NO WARRANTY.
    35. For details type `warranty'.
    36. 1.1+2
    37. 3.1
    38. 2.5-3.9
    39. -1.4
    40. 1.5>4
    41. 0
    42. 5>3
    43. 1
    44. quit  # 退出交互模式
    45. # 不进入交互模式直接使用,bc需要放在最后
    46. [root@server ~]# echo "scale=3;11/3" | bc  
    47. 3.66

     例 2:

    1. # 返回变量长度
    2. [root@server ~]# str1="hello world"
    3. [root@server ~]# echo ${#str1}
    4. 11
    5. # 变量截取
    6. [root@server ~]# echo ${str1:0:3} # 从左边第1个字符开始截取3
    7. hel
    8. [root@server ~]# echo ${str1::3} # 可以省略起始0
    9. hel
    10. [root@server ~]# echo ${str1:1} # 从下标1开始截取到尾部
    11. ello world
    12. [root@server ~]# echo ${str1:0-1:1} # 从右边第一个字符开始截取1个,左边第一个为0,右边第
    13. 一个为0-1
    14. d
    15. [root@server ~]# echo ${str1:0-5} # 从右边第5个开始截取到尾部
    16. world
    17. [root@server ~]# echo ${str1: -5} # 使用空格替代0,同上
    18. world
    19. [root@server ~]# echo ${str1:-5} # 没有空格表示提取整串
    20. hello world

    总结

  • 相关阅读:
    为什么全都来当测试/开发程序员?最吸引人的地方......
    springBoot2笔记
    【计算机网络笔记】计算机网络性能(2)——时延带宽积、丢包率、吞吐量/率
    springboot(13):spring 过滤器和拦截器的区别
    下一代实时数据库:Apache Doris 【四】扩容缩容
    Aptos教程-参与官方激励测试网(AIT2 激励测试网)
    Stable Diffusion 模型下载:FenrisXL(芬里斯XL)
    C++ 下sensor_msgs::PointCloud2数据的高效读取
    .NET Core 中插件式开发实现
    SAP UI5 SmartTable 控件本地运行时进行 Excel 导出的单步调试
  • 原文地址:https://blog.csdn.net/zhoutong2323/article/details/133997127