linux-shell-基础与变量和运算符-1

Linux Shell 脚本

参考:鸟哥的私房菜,Bash 脚本教程

Bash 脚本的定义

Bash 脚本是一个包含一系列命令的文件,这些命令由 bash 程序逐行执行。它允许你通过命令行执行一系列操作,如导航到特定目录、创建文件夹和启动进程,通过将这些命令保存在脚本中,你可以多次重复相同的操作,并通过运行脚本执行它们。

一句话总结:面向过程,通过一堆命令的集合,从上往下执行,一个一个命令运行获取最终的结果

Bash 脚本的优点

Bash 脚本是一种强大且灵活的工具,可以用于自动化系统管理任务、管理系统资源以及在 Unix/Linux 系统中执行其他例行任务。Shell 脚本的一些优点包括:

  • 自动化:Shell 脚本允许你自动化重复性任务和过程,节省时间并减少手动执行时可能出现的错误。
  • 可移植性:Shell 脚本可以在各种平台和操作系统上运行,包括 Unix、Linux、macOS,甚至通过使用模拟器或虚拟机在 Windows 上运行。
  • 灵活性:Shell 脚本高度可定制,可以轻松修改以满足特定需求。它们还可以与其他编程语言或实用程序结合,创建更强大的脚本。
  • 易访问性:Shell 脚本易于编写,不需要任何特殊工具或软件。它们可以使用任何文本编辑器进行编辑,并且大多数操作系统都有内置的 shell 解释器。
  • 集成:Shell 脚本可以与其他工具和应用程序集成,如数据库、Web 服务器和云服务,从而实现更复杂的自动化和系统管理任务。
  • 调试:Shell 脚本易于调试,大多数 shell 都内置调试和错误报告工具,可以帮助快速识别和修复问题。

如何创建和执行 Bash 脚本

  • 脚本命名约定

    按照惯例,bash 脚本以 .sh 结尾。然而,即使没有 sh 扩展名,bash 脚本也可以正常运行。

    bash 复制代码
    [root@localhost opt]# ls
    test1.sh
  • 添加 Shebang

    Bash 脚本以 shebang 开头。Shebang 是 bash # 和 bang ! 的组合,后跟 bash shell 路径。这是脚本的第一行。Shebang 告诉 shell 通过 bash shell 执行它。Shebang 指向 bash 解释器的绝对路径。

    bash 复制代码
    [root@localhost opt]# cat test1.sh 
    #!/usr/bin/env bash
    #
    
    # 或 /bin/bash ,  可以用上面这个,国产化/bin/bash有可能报错
  • 创建第一个脚本

    bash 复制代码
    [root@localhost opt]# cat -n test1.sh 
         1	#!/usr/bin/env bash
         2	#
         3	
         4	echo `date`
         5	echo -e "\n请输入目录路径"
         6	read the_path
         7	echo "hello world"
         8	ls $the_path
    
    [root@localhost opt]# bash test1.sh 
    2025年 11月 02日 星期日 19:42:52 CST
    请输入目录路径
    /opt     <-- 手动输入路径
    hello world
    test1.sh
    • 分析一下

      • 第 1 行:Shebang (#!/usr/bin/env bash) 指向 bash shell 路径。
      • 第 2 行:echo 命令在终端显示当前日期和时间。注意 date 在反引号中。
      • 第 4 行:我们希望用户输入一个有效的路径。
      • 第 5 行:read 命令读取输入并将其存储在变量 the_path 中。
      • 第 8 行:ls 命令使用存储路径的变量并显示当前的文件和文件夹。
    • 执行脚本

      bash 复制代码
      # 用以下几种
      chmod +x test1.sh   <--- 需要先加上可执行权限
      bash test1.sh       <--- 如果没有加x权限就用bash
      ./test1.sh          <--- 有x权限就直接./用
    • 注释: #

      bahs 复制代码
      [root@localhost opt]# cat test2.sh 
      #!/usr/bin/env bash
      #
      #  注释一下
    • shell特殊字符

      名称 字符 实际作用
      双引号 " 用来使shell 无法认出除字符$、' 、飞外的任何字符或字符串,也称之为弱引用
      单引号 ' 用来使shell 无法认出所有特殊字符,也称之为强引用
      反引号 ` 用来特换命令,将当前命令优先执行
      分号 ; 允许在一行放多个命令
      & 后台执行,建议带上nohup
      大括号 {} 创建命令块
      字符集合 <>& 重定向
      字符集合 * ? \[\] ! 表示模式匹配
      $ 变量名的开头
      # 注释,第一行魔数除外

变量和运算符

在 Bash 脚本中,以下是变量命名规范:变量是放置在内存中的一定的存储单元,这个存储单元里存放的是这个单元的值,这个值是可以改变的,我们称之为变量。

  • 命名规范

    1. 变量名称应以字母或下划线 (_) 开头。
    2. 变量名称可以包含字母、数字和下划线 (_)。
    3. 变量名称区分大小写。
    4. 变量名称不应包含空格或特殊字符。
    5. 使用能反映变量用途的描述性名称。
    6. 避免使用保留关键字(如 if, then, else, fi 等)作为变量名称。
  • 变量种类

    变量 说明
    内部变量 生效范围为当前shell进程;对当前shell之外的其它shell进程, 包括当前shell的子shell进程均无效
    环境变量 生效范围为当前shell进程及其子进程
    本地变量 生效范围为当前shell进程中某代码片断,通常指函数
    位置变量 1, 2, ...来表示,用于让脚本在脚本代码中调用通过命令行传递给它的参数
    特殊变量 ?, 0, \*, @, #,$
  • 内部变量

    • 可以是直接字串:name="root"

    • 变量引用:name="$USER"

    • 命令引用:name=`COMMAND`

    • 显示已定义的所有变量:set

    • 删除变量:unset name

    • 变量说明

      变量名 作用
      PWD 表示当前的工作目录, 其变量值等同于pwd 内部命令的输出
      RANDOM 每次引用这个变量时都会生成一个均匀分布的0 ~ 32767 范围内的随机整数
      SCONDS 脚本已经运行的时间(单位:秒)
      PPID 当前进程的父进程的进程ID
      $? 表示最近一次执行的命令或shell 脚本的出口状态
  • 环境变量

    • 变量说明

      变量名 作用
      EDITOR 用于确定命令行编辑所用的编辑程序,通常为vim
      HOME 用户主目录
      PATH 指定命令的检索路径
    • 示例

      bash 复制代码
      # 将程序的执行文件加入到系统默认环境变量中,如 java
      ]# cat /etc/profile.d/java.sh 
          export JAVA_HOME=/usr/java/jdk
          export CLASSPATH=.:$JAVA_HOME/jre/lib/rt.jar:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
          export PATH=$PATH:$JAVA_HOME/bin
      
      ]# source !$  然后env
      PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/usr/java/jdk/bin:/root/bin:/usr/java/jdk/bin   # 加入的默认 PATH
      PWD=/root/testBash/231  # 当前的环境变量
      JAVA_HOME=/usr/java/jdk  # JAVA_HOME 路径
    • 配置文件读取: /etc/profile -->/etc/profile.d/*.sh -->~/.bash_profile-->~/.bashrc -->/etc/bashrc

      1. /etc/profile: 全局,当前系统上所有用户都可以读取到环境变量
      2. $HOME/.bash__profile: 当前用户的环境变量,只局限于当前这个用户
  • 位置变量

    • 只读变量:只能声明,但不能修改和删除
    • 声明只读变量: 1、 readonly name 2、declare -r name
    • 查看只读变量: readonly -p
  • 特殊变量

    符号 作用
    $0 当前脚本的名称
    $n 传递给脚本或函数的参数。n 是一个数字,表示第几个参数。 例如,第一个参数是1,第二个参数是2。
    $# 表示位置参数的总数
    $* 传递给脚本或函数的所有参数
    $@ 传递给脚本或函数的所有参数。被双引号""包含时,与 $* 稍有不同
    $? 上个命令的退出状态,或函数的返回值。
    $$ 当前Shell进程ID。对于 Shell 脚本,就是这些脚本所在的进程ID。
  • 示例

    • 位置参数脚本

      bash 复制代码
      [root@localhost opt]# cat test3.sh 
      #!/usr/bin/env bash
      #
      a1="hello"
      read -p "输入字符串" a2
      echo $a1
      echo $a2
      
      [root@localhost opt]# bash test3.sh 
      输入字符串1
      hello
      1
    • $#,$*,$@

      bash 复制代码
      [root@localhost opt]# cat -n test4.sh 
           1	#!/usr/bin/env bash
           2	#
           3	echo "总数: $#" 
           4	echo "@: $@"
           5	echo "@: "$*
           6	
           7	echo $3 $2 $4 $1
      [root@localhost opt]# bash test4.sh 11 22 33 44
      总数: 4                --> echo "总数: $#" 
      @: 11 22 33 44		  --> echo "@: $@"
      @: 11 22 33 44		  --> echo "@: "$*
      33 22 44 11		      --> echo $3 $2 $4 $1  位置参数
    • 获取元组最后位

      bash 复制代码
      # ALL_VALUE[$((${#ALL_VALUE[@]}-1))]
    • $@ 与 $* 的区别?

      • @ 和 * 都表示脚本或者函数传入的参数,不被双引号""包含时,都以 1 2 ... $n 的形式输出所有参数,
      • 但是当它们被双引号 "" 包含时,
        • "\*" 会将所有的参数作为一个整体,以"1 2 ... n"的形式输出所有参数。
        • "@" 会将各个参数分开,以的1 2 ... n形式输出所有参数
  • 调试shell脚本

    bash 复制代码
    1、脚本中加上
    	set -x  # 打印过程
    	set +x  # 只打印部分过程
    
    2、直接使用   bash -x script.sh    # 用来测试脚本方便
  • 退出变量

    退出: 可以利用 exitn ,n必须是0-255范围的整数,$?内部变量可以执行最后一条命令的退出状态, 0为true, 其它数值皆为errors

    bash 复制代码
    # 一般正常都会 echo $?   值为0成功
    # 脚本中可以定义  exit 0 或者 1  自行定义退出变量
相关推荐
且从容.2 小时前
Ubuntu安装flume
linux·ubuntu·flume
承渊政道2 小时前
Linux网络学习【Reactor反应堆模式】
linux·网络·学习·ubuntu·reactor
讯捷蓝达4 小时前
戴尔R720xd服务器卡死在 “Configuring Memory...Done“,换了内存还是卡?问题根本不在内存
运维·服务器
且从容.5 小时前
ubuntu安装flink
linux·ubuntu·flink
爱和冰阔落6 小时前
【Linux网络】TCP 服务器如何并发处理多个客户端?从 fork、僵尸进程到双重 fork
linux·运维·服务器·网络
程序员沉梦听雨6 小时前
WSL2的安装与使用
linux·wsl
微小的鱼7 小时前
Linux的渲染与显示系统链路
android·java·linux
lisanmengmeng7 小时前
alertmanger 标签 rules 打上分组标签
linux·运维·服务器
Android系统攻城狮8 小时前
Linux FFmpeg深度解析之av_write_frame调用流程与实战(三十三)
linux·运维·服务器·ffmpeg·音视频进阶·ffmpeg音视频
上火的金鱼妹8 小时前
k8s生产实际问题排查(网关,数据库读写等)
运维·服务器