Linux Shell 脚本
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命令使用存储路径的变量并显示当前的文件和文件夹。
- 第 1 行:Shebang (
-
执行脚本
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 脚本中,以下是变量命名规范:变量是放置在内存中的一定的存储单元,这个存储单元里存放的是这个单元的值,这个值是可以改变的,我们称之为变量。
-
命名规范
- 变量名称应以字母或下划线 (
_) 开头。 - 变量名称可以包含字母、数字和下划线 (
_)。 - 变量名称区分大小写。
- 变量名称不应包含空格或特殊字符。
- 使用能反映变量用途的描述性名称。
- 避免使用保留关键字(如
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- /etc/profile: 全局,当前系统上所有用户都可以读取到环境变量
- $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脚本
bash1、脚本中加上 set -x # 打印过程 set +x # 只打印部分过程 2、直接使用 bash -x script.sh # 用来测试脚本方便 -
退出变量
退出: 可以利用 exit[n] ,n必须是0-255范围的整数,$?内部变量可以执行最后一条命令的退出状态, 0为true, 其它数值皆为errors
bash# 一般正常都会 echo $? 值为0成功 # 脚本中可以定义 exit 0 或者 1 自行定义退出变量