Shell 编程规范与变量

目录

一.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/stdin0键盘
标准输出通过该设备向用户输出数据/dev/stdout1显示器
标准错误输出通过该设备报告执行出错信息/dev/stder2显示器

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]# 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/833975.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

论文分享[cvpr2018]Non-local Neural Networks非局部神经网络

论文 https://arxiv.org/abs/1711.07971 代码https://github.com/facebookresearch/video-nonlocal-net 非局部神经网络 motivation:受计算机视觉中经典的非局部均值方法[4]的启发&#xff0c;非局部操作将位置的响应计算为所有位置的特征的加权和。 非局部均值方法 NLM&#…

男士内裤什么牌子的好?男士内裤五大排名品牌推荐

夏天快到了&#xff0c;你是不是在为内裤不够舒适透气、质量不好而困扰呢&#xff1f;现在市面上的男士内裤品牌众多&#xff0c;而且还有各种材质的分类&#xff0c;让大家一时也不知道该选什么好。 那么最近我也是特别购置了近期热门的几个男士内裤品牌进行测评&#xff0c;今…

在线教育系统开发流程设计,如何选择教育类app?有哪些优势呢?

教育培训APP是为培训机构搭建的一个智能化、个性化、信息化的网络展示平台。在线教育春天真的来了吗?据调查&#xff0c;我国网民规模达8.02亿&#xff0c;普及率57.7%。其中&#xff0c;手机网民规模已达7.88亿&#xff0c;中国APP开发数量更是超过美国成为全球第一。如何选择…

(十六)Servlet教程——Servlet文件下载

Servlet文件下载 文件下载是将服务器上的资源下载到本地&#xff0c;可以通过两种方式来下载服务器上的资源。第一种是使用超链接来下载&#xff0c;第二种是通过代码来下载。 超链接下载 在HTML或者JSP页面中使用超链接时&#xff0c;可以实现页面之间的跳转&#xff0c;但是…

如何使用google.protobuf.Struct?

google.golang.org/protobuf/types/known/structpb 包提供了一种方式来创建和操作 google.protobuf.Struct 类型的数据。google.protobuf.Struct 是一种灵活的数据类型&#xff0c;可以表示任何结构化数据。 以下是如何使用 structpb 包的一些示例&#xff1a; 创建 Struct&a…

RK3568 学习笔记 : Linux emmc 内核启动 rootfs 根文件系统无法正常挂载问题的分析

问题描述 平台 &#xff1a; NanoPi-R5C 开发板 RK3568 平台。 手动编译的 Linux 内核&#xff0c;结果发现大概率 emmc 无法正常初始化&#xff0c;导致 rootfs 根文件系统无法正常挂载 Linux 内核版本&#xff1a; 6.1 Linux 内核代码位置&#xff1a; https://github.com…

Sql语法1

数据库语言大概可以分为四大类 1、DML&#xff1a;&#xff08;Database Manipulation Language&#xff09;:insert,update,delete 2、DQL&#xff1a;&#xff08;Database Query Language&#xff09;:select 3、DCL&#xff1a;&#xff08;Database Control Langu…

第2章 WebServer进阶

2.1 使用多线程处理多用户请求 2.1.1 多线程Socket通信 在上一章的案例中&#xff0c;服务端显然只能处理一次浏览器请求&#xff0c;请求一次浏览器端就结束程序。如何解决这个问题呢&#xff1f;可以采用多线程Socket通信技术&#xff0c;解决多用户并发请求。 在多线程Sock…

从谚语:“一手交钱,一手交货来”谈谈什么是数据库事务

事务与交易 一手交钱&#xff0c;一手交货 一手交钱&#xff0c;一手交货&#xff0c;谚语&#xff0c;意思是指钱和货当场相交&#xff0c;互不拖欠。出自明朝施耐庵《水浒传》第二一回。 Transaction 意思 我们先来看一下来自于剑桥英-英词典的解释&#xff1a; transac…

matlab中interp2函数应用

interp2 函数在 MATLAB 中用于进行二维插值。当使用 nearest 选项时&#xff0c;它会执行最近邻插值&#xff0c;即对于给定的目标点&#xff0c;函数将选择网格中距离其最近的点的值作为该目标点的插值结果。 以下是 interp2 函数在 nearest 模式下的用法示例&#xff0c;以及…

Flask-HTTP请求、响应、上下文、进阶实验

本节主要目录如下&#xff1a; 一、请求响应循环 二、HTTP请求 2.1、请求报文 2.2、Request对象 2.3、在Flask中处理请求 2.4、请求钩子 三、HTTP响应 3.1、响应报文 3.2、在Flask中生成响应 3.3、响应格式 3.4、Cookie 3.5、session&#xff1a;安全的Cookie 四、…

企业车辆管理系统参考论文(论文 + 源码)

【免费】关于企业车辆管理系统.zip资源-CSDN文库https://download.csdn.net/download/JW_559/89282550 企业车辆管理系统 摘 要 随着经济的日益增长,车辆作为最重要的交通工具,在企事业单位中得以普及,单位的车辆数目已经远远不止简单的几辆,与此同时就产生了车辆资源的合理…

Codeforces Round 940 (Div. 2) and CodeCraft-23 D. A BIT of an Inequality

A BIT of an Inequality 题目描述 给你一个数组 a 1 , a 2 , … , a n a_1, a_2, \ldots, a_n a1​,a2​,…,an​ 。求这样的图元&#xff08; x , y , z x, y, z x,y,z &#xff09;的个数&#xff1a; 1 ≤ x ≤ y ≤ z ≤ n 1 \leq x \leq y \leq z \leq n 1≤x≤y≤z≤…

汽车灯罩一般都是用什么材质做的?汽车车灯的灯罩如果破损破裂破洞了要怎么修复?

汽车灯罩一般都是用什么材质做的&#xff1f; 汽车灯罩一般使用的主要材质是聚碳酸酯&#xff08;PC&#xff09;和丙烯酸酯&#xff08;PMMA&#xff09;这两种塑料。这两种材料具有良好的透明性、耐候性和耐冲击性&#xff0c;因此非常适合用于汽车灯罩的制造。 聚碳酸酯&am…

小程序支付的款项流转与到账时间

商家做小程序&#xff0c;最关心的是客户通过小程序下单支付的钱&#xff0c;是怎么样的流转状态以及最终到哪里。因此&#xff0c;本文将详细解析款项最终流向何处以及多久能够到账。 一、小程序支付的款项流向 当用户在小程序内完成支付后&#xff0c;款项并不会直接到达商…

5月8日学习记录

_[FBCTF2019]RCEService&#xff08;preg_match函数的绕过&#xff09; 涉及知识点&#xff1a;preg_match函数绕过&#xff0c;json的格式&#xff0c;正则回溯 打开环境&#xff0c;要求用json的格式输入 搜索学习一下json的语法规则 数组&#xff08;Array&#xff09;用方括…

Map-Reduce是个什么东东?

MapReduce是一种用于使用并行分布式算法在集群计算机上处理大型数据集的编程模型及其相关实现。这一概念首先由Google普及&#xff0c;并随后作为Apache Hadoop项目的一部分开源发布。 MapReduce的基本工作流程&#xff1a; 映射(Mapping)&#xff1a;这是第一阶段&#xff0c…

制造版图大变革!逾10座晶圆厂蓄势待发 | 百能云芯

在全球半导体产业的激烈竞争和市场需求的复杂波动中&#xff0c;晶圆厂建设热潮正在美国兴起&#xff0c;这一波建设浪潮的核心动力之一&#xff0c;便是美国政府推出的《芯片与科学法案》所承诺的巨额补贴&#xff0c;旨在提升美国在全球半导体行业的竞争力。 当地时间4月25日…

嵌入式—模块代码(一)

&#x1f3ac; 秋野酱&#xff1a;《个人主页》 &#x1f525; 个人专栏:《Java专栏》《Python专栏》 ⛺️心若有所向往,何惧道阻且长 文章目录 程序结构GPIO操作UART操作接收逻辑发送 以下模板代码均基于官方2023.07.17版本。 程序结构 #include "Config.h" #inc…

JSP技术讲解

目录 1、JSP简介 2、JSP体验 3、JSP运行原理 4、JSP基本语法 5、JSP指令 6、JSP内置九大对象 7、JSP标签 8、JSP配置 9、JSP排错 10、总结 在前面的Servlet学习中发现Servlet本质是一个java程序&#xff0c;因此Servlet更加擅长编写程序的业务逻辑&#xff0c;而如果要…