目录
一.Shell
1.shell 的概念
2.Linux 中有哪些 Shell ?
二.Shell 脚本概述
1.Shell 脚本的概念
2.shell 脚本应用场景
3.shell 脚本的作用
三.Shell脚本的构成与执行
1.Shell脚本的构成
2.Shell脚本的执行
四.重定向与管道操作
1.交互式硬件设备
2.重定向操作
3.操作实例
4.管道操作符号" | "
五.Shell 变量的作用与类型
1.变量的作用:
2.变量的类型
(1)自定义变量:由用户自己定义、修改和使用
(2)特殊变量:
3.设置变量的作用范围
六.变量的运算
1.整数变量的运算
2.浮点数变量的运算
七.特殊的 Shell 变量
1.环境变量
2.只读变量
3.位置变量
4.预定义变量
拓展:date 的用法
一.Shell
1.shell 的概念
Shell 是一个特殊的应用程序,它介于操作系统内核与用户之间,充当了一个“翻译官”的角色,负责接收用户输入的操作指令(命令)并进行解释,将需要执行的操作传递给内核执行,并输出执行结果。
2.Linux 中有哪些 Shell ?
[root@localhost ~]# cat /etc/shells
/bin/sh
/bin/bash
/usr/bin/sh
/usr/bin/bash
/usr/sbin/nologin
/bin/tcsh
/bin/csh
sh:UNIX最初使用的 shell,已经被bash所替换。
bash:基准于GNU的框架下发展出的Shell,是 sh 的扩展。
csh:语法有点类似于c语言的Shell。
tcsh:整合了csh,提供更多的功能。
nologin:奇怪的shell,这个shell可以让用户无法登录主机。
注意:
最常用的就是bash、tcsh、csh、sh、nologin这些shell;都是依据Linux发展者的不同所创造出的不同版本。
bash(/bin/bash)是目前大多数 Linux 版本采用的默认 Shell。
为什么系统上合法的Shell要写入/etc/shells这个文件呢?
这是因为系统某些服务运行过程中,会去检查用户能够使用的Shell,而这些shell的查询就是借由/etc/shells这个文件。
用户什么时候可以取得shell来工作?用户默认会取得哪一个shell?
当用户登录的时候,系统就会给我一个shell让我来用,而这个登录取得的Shell就记录在/etc/passwd这个文件内。
二.Shell 脚本概述
1.Shell 脚本的概念
将要执行的命令按顺序保存到一个文本文件
给该文件可执行权限
可结合各种 shell 控制语句以完成更复杂的操作
2.shell 脚本应用场景
重复性操作
交互性任务
批量事务处理
服务运行状态监控
定时任务执行
3.shell 脚本的作用
自动化运维
批量化重复操作可以编写脚本结合计划任务自动周期运行
减轻管理员工作量
提高处理文本文件的速度
避免配置出错
三.Shell脚本的构成与执行
1.Shell脚本的构成
(1)脚本申明解释器
若第一行为“ #!/bin/bash ”,表示此行以下的代码语句是通过 /bin/bash 程序来解释执行,
#!/bin/bash为默认解释器。还有其它类型的解释器,比如#!/usr/bin/python、#!/usr/bin/expect。
(2)编写注释信息
以“#”开头的语句表示为注释信息,被注释的语句在运行脚本时不会被执行。
(3)编写执行语句
按照顺序编写要执行的命令语句
(4)示例
[root@localhost opt]# vim 1.sh #创建并写入内容#!/bin/bash #脚本申明解释器#this is a example < 2024-05-07 > #编写注释信息 cd /boot/ #写入的执行语句
pwd
ls -lh vml*
2.Shell脚本的执行
(1)使用 bash 或 sh 指定脚本文件运行;不要求文件必须有 x 执行权限
[root@localhost opt]# bash 1.sh
/boot
-rwxr-xr-x. 1 root root 6.5M 4月 25 16:08 vmlinuz-0-rescue-7629a26e6c83475ab9d3383c007e7f61
-rwxr-xr-x. 1 root root 6.5M 6月 28 2022 vmlinuz-3.10.0-1160.71.1.el7.x86_64
[root@localhost opt]#
(2)使用指定路径的命令来运行脚本;要求文件必须有 x 执行权限
[root@localhost opt]# chmod +x 1.sh #给文件授予执行的权限
[root@localhost opt]# ll #查看文件是否有执行权限
总用量 4
-rwxr-xr-x. 1 root root 72 5月 7 17:05 1.sh
[root@localhost opt]# /opt/1.sh #绝对路径运行文件
/boot
-rwxr-xr-x. 1 root root 6.5M 4月 25 16:08 vmlinuz-0-rescue-7629a26e6c83475ab9d3383c007e7f61
-rwxr-xr-x. 1 root root 6.5M 6月 28 2022 vmlinuz-3.10.0-1160.71.1.el7.x86_64[root@localhost opt]# ./1.sh #相对路径执行权限
/boot
-rwxr-xr-x. 1 root root 6.5M 4月 25 16:08 vmlinuz-0-rescue-7629a26e6c83475ab9d3383c007e7f61
-rwxr-xr-x. 1 root root 6.5M 6月 28 2022 vmlinuz-3.10.0-1160.71.1.el7.x86_64
这两种方法是在子shell环境中执行脚本
拓展:source 命令 在当前shell环境当中执行文件或脚本中的命令,不要求文件有 x执行权限;但是会切换到执行命令的目录中;会在当前shell环境中执行脚本。
[root@localhost opt]# chmod -x 1.sh #去除文件的的x执行权限
[root@localhost opt]# ll
总用量 4
-rw-r--r--. 1 root root 72 5月 7 17:05 1.sh[root@localhost opt]# source 1.sh #source命令
/boot
-rwxr-xr-x. 1 root root 6.5M 4月 25 16:08 vmlinuz-0-rescue-7629a26e6c83475ab9d3383c007e7f61
-rwxr-xr-x. 1 root root 6.5M 6月 28 2022 vmlinuz-3.10.0-1160.71.1.el7.x86_64[root@localhost opt]# . 1.sh #.相对于source命令
/boot
-rwxr-xr-x. 1 root root 6.5M 4月 25 16:08 vmlinuz-0-rescue-7629a26e6c83475ab9d3383c007e7f61
-rwxr-xr-x. 1 root root 6.5M 6月 28 2022 vmlinuz-3.10.0-1160.71.1.el7.x86_64
四.重定向与管道操作
1.交互式硬件设备
类型 | 解释 | 设备文件 | 文件描述编号 | 默认设备 |
标准输入 | 从该设备中接收用户通过键盘输入的信息 | /dev/stdin | 0 | 键盘 |
标准输出 | 通过该设备向用户输出数据 | /dev/stdout | 1 | 显示器 |
标准错误输出 | 通过该设备报告执行出错信息 | /dev/stder | 2 | 显示器 |
2.重定向操作
类型 | 操作符 | 用途 |
重定向输入 | < | 从指定的文件中读取数据,不是从键盘输入读取 |
重定向输出 | > | 将输出的结果保存在指定的文件中(覆盖原文件) |
>> | 将输出的结果追加在指定文件的末尾 | |
重定向错误输出 | 2> | 将错误信息保存在指定的文件(覆盖原文件内容) |
2>> | 将错误信息追加在指定文件的末尾 | |
混合输出 | &>、>& | 将标准输出和标准错误信息都保存在同一个文件中 |
混合追加 | &>> | 将正常和错误输出 |
3.操作实例
(1)标准输入
[root@localhost boot]# passwd test
更改用户 test 的密码 。
新的 密码: #使用键盘输入
无效的密码: 密码少于 8 个字符
重新输入新的 密码:
passwd:所有的身份验证令牌已经成功更新。[root@localhost boot]# echo 1234567 | passwd --stdin test #使用--stdin 代替键盘
更改用户 test 的密码 。
passwd:所有的身份验证令牌已经成功更新。
(2)重定向输入 < ;从文件中读取数据,交给命令使用
[root@localhost opt]# passwd --stdin test < password.txt
更改用户 test 的密码 。
passwd:所有的身份验证令牌已经成功更新。
(3)重定向输出 > 和 重定向追加 >>
[root@localhost opt]# echo 123123 > password.txt #重定向输出
[root@localhost opt]# cat password.txt
123123[root@localhost opt]# echo 123456 >> password.txt #重定向追加
[root@localhost opt]# cat password.txt
123123
123456
(4)重定向错误输出 2> ;2代表的是标准错误输出中的文件描述编号;
[root@localhost opt]# ech 123456 > password.txt #命令错误会出现报错信息
bash: ech: 未找到命令...
[root@localhost opt]# ech 123456 2> password.txt #不想报错出现使用 2> 保存到文件中
[root@localhost opt]# cat password.txt
bash: ech: 未找到命令...[root@localhost opt]# echo 123456 2> password.txt
123456 #如果命令输入正确,会将内容显示到屏幕中,且覆盖文件
[root@localhost opt]# cat password.txt 内容但是文件不会存入信息,因为2>只会存放错误信息
[root@localhost opt]# 到文件中。
(5)重定向错误追加 2>>
[root@localhost opt]# ech 123456 2> password.txt #会保存一条错误信息
[root@localhost opt]# cat password.txt 一个>会覆盖文件内容
bash: ech: 未找到命令...[root@localhost opt]# ech 123456 2>> password.txt #会追加保存一条错误信息
[root@localhost opt]# cat password.txt
bash: ech: 未找到命令...
bash: ech: 未找到命令...
(6)混合输出 &> 和 混合追加输出 &>>
[root@localhost opt]# echo 123456 &> password.txt
[root@localhost opt]# cat password.txt
123456
[root@localhost opt]# echo 123456 >& password.txt # &> 和 >& 是一样的效果
[root@localhost opt]# cat password.txt
123456[root@localhost opt]# ech 123456 &> password.txt #一个>会覆盖文件内容
[root@localhost opt]# cat password.txt
bash: ech: 未找到命令...[root@localhost opt]# echo 123456 &>> password.txt #两个>>是追加输出
[root@localhost opt]# cat password.txt
bash: ech: 未找到命令...
123456
拓展:混合输出的方式:2>&1 (将标准输出和错误输出都重定向到标准输出中)
命令 > 文件 2>&1 效果等效于混合输出ls -lh 标准输出 到屏幕 ; 1 --> 屏幕
ls -lh > test.txt 重定向输出 到 test.txt ; 1 --> test.txt
2>&1 错误输出 重定向到 标准输出 ; 2 --> 1
[root@localhost opt]# ls -lh > password.txt 2>&1
[root@localhost opt]# cat password.txt
总用量 8.0K
-rw-r--r--. 1 root root 47 5月 7 18:24 1
-rw-r--r--. 1 root root 72 5月 7 17:05 1.sh
-rw-r--r--. 1 root root 0 5月 7 18:27 password.txt
[root@localhost opt]# ls -lyh > password.txt 2>&1
[root@localhost opt]# cat password.txt
ls:无效选项 -- y
Try 'ls --help' for more information.#无论错误输出或标准输出都标准输出到这个文件中
4.管道操作符号" | "
将管道符号“|”左侧的命令输出的结果,作为右侧命令的输入(处理对象),同一行命令中可以使用多个管道。
[root@localhost opt]# ss -lntp | grep 22
LISTEN 0 5 192.168.122.1:53 *:* users:(("dnsmasq",pid=1790,fd=6))
LISTEN 0 128 *:22 *:* users:(("sshd",pid=1202,fd=3))
LISTEN 0 128 [::]:22 [::]:* users:(("sshd",pid=1202,fd=4))
有些命令则需要管道符后面要有xargs命令来执行传递参数;如 rm 删除命令
[root@localhost opt]# ls /opt/ | rm -rf
[root@localhost opt]# ll
总用量 4
-rw-r--r--. 1 root root 66 5月 7 18:34 password.txt
[root@localhost opt]# ls /opt/ | xargs rm -rf
[root@localhost opt]# ll
总用量 0
五.Shell 变量的作用与类型
1.变量的作用:
用来存放系统和用户需要使用的特定参数(值)
变量名:使用固定的名称,由系统预设或用户定义
变量值:能够根据用户设置、系统环境的变化而变化
2.变量的类型
(1)自定义变量:由用户自己定义、修改和使用
定义一个新的变量
[root@localhost opt]# 123ABC=abc #变量名要以字母或者下划线开头
bash: 123ABC=abc: 未找到命令...
[root@localhost opt]# ABC123=abc
[root@localhost opt]# _123abc=123456 #字母区分大小写
[root@localhost opt]# _123ABC=654321 不同的是不一样的变量值[root@localhost opt]# echo $_123abc #用echo + $符号放在变量名前
123456 就可以查看变量值
[root@localhost opt]# echo $_123ABC
654321
[root@localhost opt]# echo $ABC123
abc
[root@localhost opt]#
同时查看多个变量
[root@localhost opt]# a=123
[root@localhost opt]# b=abc
[root@localhost opt]# echo $a$b
123abc
[root@localhost opt]# echo $aabc #无法查看[root@localhost opt]# echo ${a}abc #再变量名两边加上大括号之后就可以了
123abc
[root@localhost opt]#
如果想要两个变量的值进行交换的操作
先准备一个临时变量:c ,先把c=$a,再把a=$b、b=$c,即可完成两个变量之间的交换
[root@localhost opt]# a=lll
[root@localhost opt]# b=ppp
[root@localhost opt]# c=$a
[root@localhost opt]# echo $a
lll
[root@localhost opt]# a=$b
[root@localhost opt]# b=$c
[root@localhost opt]# echo $b
lll
[root@localhost opt]# echo $a
ppp
[root@localhost opt]#
从键盘输入内容,为变量赋值
read [-p "提示信息"] 变量名 从键盘输入中获取变量值
#read 的常用选项
[root@localhost opt]# read --help
-bash: read: --: 无效选项
read: 用法:read
[-ers]
[-a 数组]
[-d 分隔符]
[-i 缓冲区文字]
[-n 读取字符数]
[-N 读取字符数]
[-p 提示符]
[-t 超时]
[-u 文件描述符]
[名称 ...]
[root@localhost opt]# read -p "请输入变量myname的值" myname
请输入变量myname的值liu
[root@localhost opt]# echo $myname
liu
[root@localhost opt]#
赋值时使用引号
双引号:允许通过$符号引用其他变量值单引号:禁止引用其他变量值,$视为普通字符
反撇号:命令替换,提取命令执行后的输出结果
[root@localhost opt]# echo $a
ppp
[root@localhost opt]# echo "$a" #双引号允许使用$引用变量
ppp
[root@localhost opt]# echo '$a' #单引号禁止引用变量,$视为普通符号
$a
[root@localhost opt]# ldd `which sshd` #反撇号命令替换,提取命令执行后的结果linux-vdso.so.1 => (0x00007fff039cc000)libfipscheck.so.1 => /lib64/libfipscheck.so.1 (0x00007f2d182da000)libwrap.so.0 => /lib64/libwrap.so.0 (0x00007f2d180cf000)libaudit.so.1 => /lib64/libaudit.so.1 (0x00007f2d17ea6000)libpam.so.0 => /lib64/libpam.so.0 (0x00007f2d17c97000)
................................下面省略.........................#效果和$()一样
[root@localhost opt]# ldd $(which sshd)linux-vdso.so.1 => (0x00007ffcce39f000)libfipscheck.so.1 => /lib64/libfipscheck.so.1 (0x00007f4e6b0c0000)libwrap.so.0 => /lib64/libwrap.so.0 (0x00007f4e6aeb5000)libaudit.so.1 => /lib64/libaudit.so.1 (0x00007f4e6ac8c000)libpam.so.0 => /lib64/libpam.so.0 (0x00007f4e6aa7d000)
................................下面省略.........................
(2)特殊变量:
环境变量、只读变量、位置变量、预定义变量
3.设置变量的作用范围
默认情况下,我们在 she ll环境中定义的变量都是局部变量,只在当前环境中有效;进入到其他的shell 环境中,就会失效。
[root@localhost yum.repos.d]# loginusers=$(who | wc -l)
[root@localhost yum.repos.d]# echo $loginusers
2
[root@localhost yum.repos.d]# bash #切换shell环境
[root@localhost yum.repos.d]# echo $loginusers #命令失效[root@localhost yum.repos.d]# exit #退出当前环境
exit
[root@localhost yum.repos.d]# echo $loginusers #命令成功
2
[root@localhost yum.repos.d]#
如果想要变量在所有 shell 环境中有效,可以在变量前面加个 export (将变量导出为全局变量)
两种格式可以混合使用格式1:export 变量名...格式2:export 变量名=变量值...
[root@localhost yum.repos.d]# export loginusers
[root@localhost yum.repos.d]# echo $loginusers
2
[root@localhost yum.repos.d]# bash #切换shell环境
[root@localhost yum.repos.d]# echo $loginusers #任然有效
2
[root@localhost yum.repos.d]# bash #再次切换两次环境
[root@localhost yum.repos.d]# bash
[root@localhost yum.repos.d]# echo $loginusers #命令任然有效
2
[root@localhost yum.repos.d]#
但是 export 只在当前会话中有效,如果打开其他会话界面,就会失效;如果想要变量在所有的shell 环境中有效,有两种办法。
【1】 进入到 /etc/bashrc 文件中加入配置;每次切换shell环境都会执行这个文件中的配置
[root@localhost yum.repos.d]# vim /etc/bashrc
........................省略................................
在文件末尾位置加入配置
loginusers=$(who | wc -l)
之后保存退出,到其他会话实验
[root@localhost yum.repos.d]# bash #切换环境
[root@localhost yum.repos.d]# echo $loginusers #命令成功
3
[root@localhost yum.repos.d]#
切换 shell 环境自动生效
【2】进入到 /etc/profile 文件中加入配置;只要用户登录,就会自动执行该文件中的命令
[root@localhost yum.repos.d]# vim /etc/profile
........................省略................................
在文件末尾位置加入配置
export loginusers=$(who | wc -l)
之后保存退出,到其他会话实验
[root@localhost ~]# echo $loginusers #断开重连后,命令依旧有效
3
[root@localhost ~]# bash
[root@localhost ~]# echo $loginusers
3
[root@localhost ~]#
如果想要立即生效,可以使用 source 命令 或者 重新登录系统自动生效
六.变量的运算
1.整数变量的运算
expr 变量1 运算符号 变量2 [运算符号 变量3].... 中间一定要有空格
常用的运算符号
加法运算: +
减法运算: -
乘法运算: \*
除法运算: /
取余数运算: %
[root@localhost ~]# expr 12 + 5 + 3
20
[root@localhost ~]# expr 20 - 5
15
[root@localhost ~]# expr 20 \* 5
100
[root@localhost ~]# expr 20 / 5
4
[root@localhost ~]# expr 20 % 3
2
注意: shell默认只支持整数变量运算,浮点数运算不支持
[root@localhost yum.repos.d]# expr 12 \* 5.5
expr: 非整数参数
(1)使用$符号进行整数变量的运算
[root@localhost yum.repos.d]# a=12
[root@localhost yum.repos.d]# b=5
[root@localhost yum.repos.d]# expr $a + $b
17
[root@localhost yum.repos.d]# expr $a - $b
7
[root@localhost yum.repos.d]# expr $a \* $b
60
[root@localhost yum.repos.d]# expr $a % $b
2
[root@localhost yum.repos.d]# expr $a / $b
2 #expr不支持小数运算
(2)使用$[]符号进行整数变量的运算
[root@localhost yum.repos.d]# a=12
[root@localhost yum.repos.d]# b=5
[root@localhost yum.repos.d]# echo $[12 + 5]
17
[root@localhost yum.repos.d]# echo $[12 - 5]
7
[root@localhost yum.repos.d]# echo $[12 /* 5] #在中括号中乘法可以不加\
bash: 12 /* 5: 语法错误: 期待操作数 (错误符号是 "* 5")
[root@localhost yum.repos.d]# echo $[12 * 5]
60
[root@localhost yum.repos.d]# echo $[12 % 5]
2[root@localhost yum.repos.d]# echo $[12+5] #在中括号中可以不用空格也可以运算
17
[root@localhost yum.repos.d]# echo $[$a+$b] #在中括号中使用$a+$b也可以运算
17
[root@localhost yum.repos.d]# echo $[a+b] #在中括号中步使用$,a+b也可以运算
17
(3)使用$(())符号进行整数变量的运算
[root@localhost yum.repos.d]# a=12
[root@localhost yum.repos.d]# b=5
[root@localhost yum.repos.d]# echo $((12+5))
17
[root@localhost yum.repos.d]# echo $((12-5))
7
[root@localhost yum.repos.d]# echo $((12*5))
60
[root@localhost yum.repos.d]# echo $((12%5))
2#$(())用法和中括号$[]差不多一致
(4)使用 let 命令运算;但是必须赋予一个变量;let 变量=变量 运算符号 变量
[root@localhost yum.repos.d]# let i=12+5
[root@localhost yum.repos.d]# echo $i
17
[root@localhost yum.repos.d]# let i=12-5
[root@localhost yum.repos.d]# echo $i
7
[root@localhost yum.repos.d]# let i=12*5
[root@localhost yum.repos.d]# echo $i
60
[root@localhost yum.repos.d]# let i=12%5
[root@localhost yum.repos.d]# echo $i
2
let 的其他运算方法 let a++、a--、a+=2、a-=2、a*=2
[root@localhost yum.repos.d]# a=10
[root@localhost yum.repos.d]# a=$[a+1]
[root@localhost yum.repos.d]# echo $a
11
[root@localhost yum.repos.d]# let a++ #等于$[a+1]
[root@localhost yum.repos.d]# echo $a
12
[root@localhost yum.repos.d]# let a-- #等于$[a-1]
[root@localhost yum.repos.d]# echo $a
11
[root@localhost yum.repos.d]# let a+=2 #等于$[a+2]
[root@localhost yum.repos.d]# echo $a
13
[root@localhost yum.repos.d]# let a-=2 #等于$[a-2]
[root@localhost yum.repos.d]# echo $a
11
[root@localhost yum.repos.d]# let a*=2 #等于$[a*2]
[root@localhost yum.repos.d]# echo $a
22
2.浮点数变量的运算
(1)bc 工具的使用
原因:Bash只支持对整数的运算,不支持浮点运算;而 bc 计算器可以很方便的进行浮点运算;
[root@192 ~]# rpm -q bc #确认是否安装
bc-1.06.95-13.el7.x86_64[root@192 ~]# echo '1.1+2.2'
1.1+2.2
[root@192 ~]# echo '1.1+2.2' | bc
3.3
[root@192 ~]# echo '1.1*2.2' | bc
2.4
[root@192 ~]# echo '1.12*2.2' | bc
2.46
(2)scale=n 的使用
如果想保留多少位小数,可以使用 scale=n 来指定小数的保留位数。
[root@192 ~]# echo 'scale=4;4.3/2.5' | bc
1.7200
[root@192 ~]# echo 'scale=3;4.3/2.5' | bc
1.720
(3)awk 工具的使用
格式:awk "BEGIN{print 算术表达式};最多可保留小数后五位。
[root@192 ~]# awk 'BEGIN{print 4.5+2.2}'
6.7
[root@192 ~]# awk 'BEGIN{print 4.5-2.2}'
2.3
[root@192 ~]# awk 'BEGIN{print 4.5*2.2}'
9.9
[root@192 ~]# awk 'BEGIN{print 4.5%2.2}'
0.1
[root@192 ~]# awk 'BEGIN{print 4.5/2.2}'
2.04545
[root@192 ~]# awk 'BEGIN{print (4.5-2.2)*2+10}' #混合运算
14.6
七.特殊的 Shell 变量
1.环境变量
由系统提前创建,用来设置用户的工作环境
配置文件:/etc/profile、~/.bash_profile
(1)查看所有的环境变量
env 命令
(2)常见的环境变量
PWD、PATH、USER、SHELL、HOME
其中用处最为广泛的环境变量为:$PATH 表示可执行文件的默认路径
[root@localhost ~]# echo $PATH #PATH环境变量保存Linux命令的搜索路径
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin[root@localhost ~]# echo $USER #查看当前正在使用的用户
root #效果和whoami一样
[root@localhost ~]# su - liu
[liu@localhost ~]$ echo $USER
liu
[liu@localhost ~]$ [root@localhost ~]# echo $SHELL #查看当前的shell环境
/bin/bash[root@localhost ~]# echo $HOME #查看当前用户的家目录
/root
[root@localhost ~]# su - liu
上一次登录:三 5月 8 16:24:10 CST 2024pts/1 上
[liu@localhost ~]$ echo $HOME
/home/liu[root@localhost ~]# echo $LANG #查看当前使用的语言和文字
zh_CN.UTF-8
[root@localhost ~]# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
[root@localhost ~]# export PATH=$PATH:/opt #将opt目录加入到环境变量中
[root@localhost ~]# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/opt#退出当前shell环境后失效
2.只读变量
用于变量值不允许被修改的情况
格式 readonly 变量名=变量值 #只读变量不允许被修改变量值和删除变量
[root@localhost ~]# a=10
[root@localhost ~]# echo $a
10
[root@localhost ~]# a=20
[root@localhost ~]# echo $a
20
[root@localhost ~]# readonly a #设置a为只读变量
[root@localhost ~]# a=30 #a不能被修改
-bash: a: 只读变量
[root@localhost ~]# echo $a
20
[root@localhost ~]# unset a #a无法被删除
-bash: unset: a: 无法反设定: 只读 variable
只有重启,才能取消只读变量
3.位置变量
表示为 $n ,n为1-9之间的数字
[root@localhost opt]# ./test.sh one two three four five six seven eight nine
./test.sh
one
two
three
four
five #一个数字对应一个数值
six
seven
eight
nine
[root@localhost opt]# ./test.sh 1 2 3 4 5 6 7 8 9
./test.sh
1
2
3
4
5
6
7
8
9
[root@localhost opt]#
注意:数字是以1为开头。1-9是正常跟在$后面即可。当数字大于或等于10,要用{ }进行使用,区别shell误识别。
[root@localhost opt]# ./test.sh one two three four five six seven eight nine ten
./test.sh
one
two
three
four
five
six
seven
eight
nine
one0
[root@localhost opt]# vim test.sh
#!/bin/bashecho $0
echo $1
echo $2
echo $3
echo $4
echo $5
echo $6
echo $7
echo $8
echo $9
echo ${10} #使用{} ; 不然含义就是 $1 加上字符 1[root@localhost opt]# ./test.sh one two three four five six seven eight nine ten
./test.sh
one
two
three
four
five
six
seven
eight
nine
ten
echo $[${10} + ${11}] #如果想使用运算,可以这样子使用num1=${10} #进行多个运算,第一种方式,太过繁琐
num2=${11} 可以提前定义好变量值
echo $[num1 + num2]
4.预定义变量
(1)$0 代表脚本本身
(2)$# 代表脚本后面跟的位置参数的数量
[root@localhost opt]# ./test1.sh
./test1.sh‘########’
0
[root@localhost opt]# ./test1.sh 1 2 3 4
./test1.sh
1‘########’
4
[root@localhost opt]# ./test1.sh 1 2 3 4 5
./test1.sh
1‘########’
5
[root@localhost opt]# ./test1.sh 1 2 3 4 5 6
./test1.sh
1‘########’
6
(3)$? 代表的是上一条Linux命令执行的返回状态码(0~255),0表示上一条命令执行正确,非0值则表示上一条命令执行异常
[root@localhost opt]# echo $?
127
[root@localhost opt]# ls -alh
总用量 8.0K
drwxr-xr-x. 2 root root 37 5月 8 17:16 .
dr-xr-xr-x. 17 root root 224 4月 25 16:09 ..
-rwxr-xr-x. 1 root root 69 5月 8 17:16 test1.sh
-rwxr-xr-x. 1 root root 159 5月 8 17:09 test.sh
[root@localhost opt]# echo $?
0
[root@localhost opt]#
(4)$* 默认代表脚本后面跟的所有参数,加上双引号后 "$*" 会把所有参数看做一个整体
(5)$@ 默认代表脚本后面跟的所有参数,加上双引号后 "$@" 还是会把每个参数看做
[root@localhost opt]# vim test2.sh
#!/bin/bash
echo "不加引号时"
echo "#### $* ####"
for i in $*
doecho $i
doneecho "#### $@ ####"
for i in $@
doecho $i
done
[root@localhost opt]# ./test2.sh one two three four five six
不加引号时
#### one two three four five six ####
one
two
three
four
five
six
#### one two three four five six ####
one
two
three
four
five
six[root@localhost opt]# vim test2.sh
#!/bin/bash
echo "加引号时"
echo "#### $* ####"
for i in "$*"
doecho $i
doneecho "#### $@ ####"
for i in "$@"
doecho $i
done
[root@localhost opt]# ./test2.sh one two three four five six
加引号时
#### one two three four five six ####
one two three four five six
#### one two three four five six ####
one
two
three
four
five
six
拓展:date 的用法
date +"%Y%m%d" 当天日期
date -d "-1 day" +"%Y%m%d" 昨天日期
date +"%Y%m01" 当月第一天
date -d "1 month" +"%Y%m01" 下个月第一天
date -d "$(date -d "1 month" +"%Y%m01") -1 day" +"%Y%m%d" 当月最后一天
[root@localhost opt]# date +"%Y%m%d"
20240508
[root@localhost opt]# date -d "-1 day" +"%Y%m%d"
20240507
[root@localhost opt]# date +"%Y%m01"
20240501
[root@localhost opt]# date -d "1 month" +"%Y%m01"
20240601
[root@localhost opt]# date -d "$(date -d "1 month" +"%Y%m01") -1 day" +"%Y%m%d"
20240531
[root@localhost opt]#