Shell 脚本是一种用于自动化任务的文本文件,其中包含一系列在 Unix、Linux 或 macOS 系统的 Shell 环境下可执行的命令。
定义 :Shell 脚本本质上是一个纯文本文件,它将一系列的 Shell 命令按特定逻辑组织在一起,以实现特定的任务。这些命令可以是系统自带的命令(如
ls
、cd
、mkdir
等),也可以是用户自定义的函数或其他可执行程序。用户可以通过执行这个脚本文件,一次性执行其中包含的所有命令,从而提高工作效率。结构:
#!/bin/bash
:指定解释器。变量赋值:
VAR=value
(等号两侧不能有空格)。条件判断:
if [ condition ]; then ... fi
。循环:
for
、while
。
每个
sh
脚本都应该以#!/bin/sh
开头,这行代码被称为 Shebang,它告诉系统使用sh
解释器来执行该脚本。
示例:
#!/bin/sh
# 这是一个简单的 sh 脚本示例
echo "Hello, World!"
# 输出 Hello, World!
在执行
sh
脚本之前,需要为脚本文件添加执行权限。可以使用chmod
命令来实现,例如:
示例:
chmod +x test.sh
# 其中,test.sh 是你的脚本文件名。添加执行权限后,就可以通过以下方式执行脚本:
./test.sh
使用
echo
命令可以将文本输出到终端。例如:
示例:
echo "This is a test message."
# 输出 This is a test message.
使用
read
命令可以从用户那里获取输入。例如:
示例:
echo "Please enter your name: "
read name
# 输入 111
echo "Hello, $name!"
# 输出 Hello, 111!
Shell 变量是在 Shell 环境中用于存储数据的标识符,它是 Shell 编程的基础组成部分,能帮助用户存储和操作各种数据,以实现不同的功能。
- 定义:自定义变量是用户在 Shell 脚本或交互式 Shell 会话中创建的变量,用于存储数据,方便后续使用和操作。
- 命名规则:
- 变量名只能由字母(大小写均可)、数字和下划线组成,变量名不能以数字开头。
- 赋值时等号两边不要有空格。
- 为了提高代码的可读性,建议使用有意义的变量名,例如用
username
存储用户名。
三种定界符在变量赋值操作中的特点
- 双引号 " ":双引号中的变量会被解析成其对应的值。
- 单引号 ' ': 将其中的内容原样输出,不会对特殊字符进行解析。
- 反撇号 ` `:将命令的执行输出作为变量值( $() 和` ` 功能一样,但更适合嵌套)
示例:
# 定义变量
name=John
age=25
# 单引号
message='Hello, $name'
echo $message
# 输出: Hello, $name
# 双引号
message="Hello, $name"
echo $message
# 输出: Hello, John
# 反引号
current_dir=`pwd`
echo $current_dir
# 输出:当前路径
# 使用 $( )
files=$(ls)
echo $files
# 输出:当前目录内容
# 引用变量时,在变量名前加上$符号。也可以使用${变量名}的形式,在变量名后面紧接着其他字符时,这种形式更清晰。
echo $name # 输出变量 name 的值
echo "My name is ${name} and I'm ${age} years old."
# 输出:My name is John and I'm 25 years old.
当前用户的环境变量:
- USER 记录了用户名
- HOME 记录了家目录
- SHEL L记录了登录解释器
- HOSTNAME 记录主机名
- UID 是用户的id号
- PWD 是当前位置
- PS1 表示Shell环境的一级提示符,即命令行提示符 (\u 用户名、\h 主机名、\W 工作目录、\$ 权限标识)
- PS2 表示二级提示符,出现在强制换行场合
- PATH 记录命令的路径
- 可以把变量放入/etc/profile(环境变量配置文件),对所有用户有效;放入~/.bash_profile,仅对当前的用户有效(定义变量是临时的,放在上面文件里才是永久的)
- 使用env可查看所有环境变量,使用set可查看所有变量
示例 1:
# hjbl.sh
cat << EOF > hjbl.sh
#!/bin/bash
# 输出各个环境变量的值
echo "用户名: $USER"
echo "家目录: $HOME"
echo "登录解释器: $SHELL"
echo "主机名: $HOSTNAME"
echo "用户ID号: $UID"
echo "当前位置: $PWD"
echo "一级提示符: $PS1"
echo "二级提示符: $PS2"
echo "命令的路径: $PATH"
EOF
./hjbl.sh
# 输出
用户名: root
家目录: /root
登录解释器: /bin/bash
主机名: centos7-server
用户ID号: 0
当前位置: /root
一级提示符: [root@centos7-server ~]#
二级提示符: >
命令的路径: /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
如果你希望某些环境变量对所有用户都有效,可以将变量的定义添加到
/etc/profile
文件中。
示例 2:
vim /etc/profile
export MY_VAR="这是一个对所有用户有效的环境变量"
# 保存退出
source /etc/profile # 使配置生效
# 如果仅对当前用户生效
vim ~/.bash_profile # 在这个文件里设置环境变量
预定义变量
- $$ 当前运行进程的PID(进程号)
- $? 上一个程序的返回状态码 (返回值为0,上一个任务成功,不是0,失败)
- $0 当前运行的脚本名
- $# 位置变量的个数
- $* 所有的位置变量
- $! 后台(最后一个进程)的PID号
位置变量
- $1 第一个参数
- $2 第二个参数
- $3 第三个参数
- ${10} 第十个参数
示例:
# 编写ydybl.sh
cat << EOF > ydybl.sh
#!/bin/bash
# 打印当前运行脚本的 PID
echo "当前运行进程的 PID: $$"
# 执行一个简单命令,并打印其返回状态码
ls /tmp
echo "上一个程序(ls /tmp)的返回状态码: $?"
# 打印当前运行的脚本名
echo "当前运行的脚本名: $0"
# 打印位置变量的个数
echo "位置变量的个数: $#"
# 打印所有的位置变量
echo "所有的位置变量(使用 \$*): $*"
# 启动一个后台进程(sleep 30 秒),并打印其 PID
sleep 30 &
echo "后台(最后一个进程)的 PID 号: $!"
# 打印第一个和第二个参数
echo "第一个参数: $1"
echo "第二个参数: $2"
EOF
# 运行ydybl.sh
./ydybl.sh 1 2
# 输出
当前运行进程的 PID: 12345
上一个程序(ls /tmp)的返回状态码: 0
当前运行的脚本名: ./ydybl.sh
位置变量的个数: 2
所有的位置变量(使用 $*): 1 2
后台(最后一个进程)的 PID 号: 12346
第一个参数: 1
第二个参数: 2
echo $[ ] 或 echo $(( ))
括号内引用变量可以省略$
示例:
# 设置变量
x=5
# echo $[]
echo $[x+21]
# 输出 26
# echo $(())
echo $((x-1)),((x*3))
# 输出 4,15
使用bc可以实现小数运算(大多数Linux操作系统自带bc计算器)
- 支持高精度数值运算
- 直接运行bc进入运算界面,quit退出
- 设置 scale=n 可约束小数精度
示例:
# 运行
bc
12.34*56.78
# 输出 700.66
scale=4
12.34*56.78
# 输出 700.6652
quit # 退出
%取余数
简写表达式 | 完整表达式 |
i++ | i=i+1 |
i-- | i=i-1 |
i+=2 | i=i+2 |
i-=2 | i=i-2 |
i*=2 | i=i*2 |
i/=2 | i=i/2 |
i%=2 | i=i%2 |
示例:
i=2
let i++;echo $i
# 输出 3
let i-=2;echo $i
# 输出 0