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    # 用来测试脚本方便
  • 退出变量

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

    bash 复制代码
    # 一般正常都会 echo $?   值为0成功
    # 脚本中可以定义  exit 0 或者 1  自行定义退出变量
相关推荐
HIT_Weston2 小时前
23、【Ubuntu】【远程开发】内网穿透:SSH 反向隧道
linux·ubuntu·ssh
买辣椒用券2 小时前
在Linux上实现Modbus RTU通信:一个轻量级C++解决方案
linux·c++
意疏2 小时前
《金仓KingbaseES vs 达梦DM:从迁移到运维的全维度TCO实测对比》
运维
chenzhiyuan20182 小时前
Linux 开发语言选择指南:不同场景该用哪种?
linux
x_lrong2 小时前
本地访问远端环境tensorboard
linux·笔记·ai·虚拟机·云服务器·tensorboard
shawnyz2 小时前
rhcse----DNS
运维·服务器
☆璇2 小时前
【Linux】Reactor反应堆模式
linux·运维·服务器·网络
拾心212 小时前
【云运维】zabbix管理(续)
运维·zabbix
成为你的宁宁2 小时前
Ubuntu安装mysql5.7及常见错误问题
linux·mysql·ubuntu