shell编程规范与变量

名词简述

面向过程语言

按照顺序执行程序

第一件事干什么—>第二件事干什么......(C,shell...)

面向对象语言

把程序看成一个整体(java,python,golang...)

三种处理逻辑

  • 顺序执行:程序按从上到下顺序执行

  • 选择执行:程序执行过程中,根据条件的不同,选择不同分支继续执行

  • 循环执行:执行过程中需要重复执行多次某段语句

shell脚本

1、shell脚本基础

1.1 shell的作用

Linux 系统中的 Shell 是一个特殊的应用程序,它介于操作系统内核与用户之间,充当 了一个“命令解释器”的角色,负责接收用户输入的操作指令(命令)并进行解释,将需要执 行的操作传递给内核执行,并输出执行结果。

 [root@31yml data]#cat /etc/shells
 /bin/sh
 /bin/bash
 /sbin/nologin
 /usr/bin/sh
 /usr/bin/bash
 /usr/sbin/nologin
 /bin/tcsh
 /bin/csh

linux中常见的shell

  • bash:基于gun的框架下发展的shell

  • csh:类似c语言的shell

  • tcsh:整合了csh提供了更多功能

  • sh:已经被bash替换

  • nologin:让用户无法登录

bash(/bin/bash)是目前大多数Linux版本采用的默认shell

shell脚本用途

  • 将简单的命令组合完成复杂的工作,自动化执行命令,提高工作效率

  • 减少手工命令的重复输入,一定程度上避免人为错误

  • 将软件或应用的安装及配置实现标准化

  • 用于实现日常性的,重复性的运维工作,如:文件打包压缩备份,监控系统运行状态并实现告警等

1.2 shell脚本组成

  • 就是将命令按顺序一一列出,最后自动执行

  • 执行需要权限,也可以直接使用绝对路径

  • 脚本其实不复杂,通用脚本环境改变后依然可以使用的脚本

 #!/bin/bash
 mount /dev/sr0 /mnt
 cd /etc/yum.repos.d
 mkdir bak
 mv *.repo bak
 echo "
 [local]
 name=local
 baseurl=file:///mnt
 gpgcheck=0
 ">>local.repo
 yum clean all
 yum makecache
 yum install tree -y

脚本的构成(三大块)

  1. 脚本申明(解释器):第一行开头“#!/bin/bash”,表示此行以下的代码语句是通过/bin/bash程序来解释执行。#!/bin/bash为默认的解释器还有其他类型的解释器,#!/bin/python #!/bin/expect

  2. 注释信息:以#开头的语句表示为注释信息

  3. 可执行语句:比如echo命令用于输出“ ”之间的字符串

1.3 脚本执行逻辑及执行方式

脚本执行逻辑

  1. 顺序执行:程序按从上到下顺序执行

  2. 选择执行:程序执行过程中,根据条件的不同,进行选择不同分支继续执行

  3. 循环执行:程序执行过程中需要重复执行多次某段语句

执行方式

1、指定路径去执行文件(需要有执行权限)

 ##加权限
 [root@31yml data]#chmod +x test.sh
 [root@31yml data]#ll
 总用量 4
 -rwxr-xr-x. 1 root root 115 8月   9 13:41 test.sh
 [root@31yml data]#/data/test.sh#绝对路径
 [root@31yml data]#./test.sh##相对路径

2、指定解释器去执行(不需要权限)

 [root@31yml data]#ll
 总用量 8
 -rw-r--r--. 1 root root  18 8月   9 17:27 test1.sh
 -rwxr-xr-x. 1 root root 115 8月   9 13:41 test.sh
 [root@31yml data]#bash test1.sh
 i am shell

3、“source”与“.”(同样不需要给予权限)

 [root@31yml data]#ll
 总用量 8
 -rw-r--r--. 1 root root  18 8月   9 17:27 test1.sh
 -rwxr-xr-x. 1 root root 115 8月   9 13:41 test.sh
 ​
 [root@31yml data]#. test1.sh
 i am shell
 [root@31yml data]#source test1.sh
 i am shell
 ​

1.4 脚本错误调试

1、命令错误

命令出错但不影响接下来的命令继续执行

2、语法错误

会影响接下来的命令,直接中断

3、逻辑错误

错误调试:

 bash -n 脚本名称 (不在当前目录下加绝对路径)     检查语法错误
 bash -x 脚本名称 (不在当前目录下加绝对路径)     逻辑错误——模拟执行

1.5 set -e

set -e(或set -o errexit)是Shell脚本中的一个选项设置,表示在任何命令执行失败(返回非零退出状态码)时立即退出脚本。这意味着如果某个命令执行失败,脚本会立即停止执行后续命令,并返回一个非零的退出状态码。set -e通常用于在脚本中快速检测错误并终止脚本执行,以避免错误继续传播。

set -e是一个全局选项设置,用于在脚本中检测命令执行错误并立即退出脚本

1.6 unset

unset [选项] 变量名

-a #删除所有变量

-v #删除指定变量

Linux unset命令的原理是删除一个或多个环境变量,它会在Shell当前进程的环境变量中查找并删除指定的变量,使得该变量不再可用。如果没有指定参数,则该命令不会有操作

用法案例:

 #删除环境变量VARNAME
 unset VARNAME
 #以可视化方式删除环境变量VARNAME
 unset -v VARNAME
 #删除只读变量VARNAME
 unset -n VARNAME
 #删除函数FUNCTIONNAME
 unset -f FUNCTIONNAME
 #重置所有位置参数($1、$2等)
 unset -i
 #删除变量VARNAME的值(不影响变量本身)
 unset -u VARNAME
 #关闭执行跟踪模式
 unset -x
 #取消“hash -r”命令的效果
 unset -h
 #清除所有选项和标记,之后的参数将被视为变量名
 unset --
 #重置所有选项为默认设置
 unset -o

1.7 seq

seq 命令是 sequence 的缩写,用于打印数字序列。数字可以是整数或者实数(带小数点)。

使用 seq 命令

在不带任何选项的情况下,使用 seq 可以生成3中不同格式的数字序列。

打印数字序列直到某一上限

最简单的例子,我们为 seq 指定一个上限,它将打印从 1 开始到我们指定的这个上限之间的数字序列。命令格式如下:

 seq n
 $ seq 4
 1
 2
 3
 4

打印两个数字之间的数字序列(指定上限和下限)

我们指定两个数字,它将打印这两个数字之间的数字序列(两个数字之间的升序排列)。命令格式如下:

seq n1 n2
$ seq 3 6
3
4
5
6

指定限值与步长(增量)

我们上述所有粒子中,数字序列中的增量为1,也可以自定义增量。命令格式如下:

seq n1 inc n2
#其中的增量值(步长)可以是整数也可以是小数。
$ seq 3 0.5 6
3.0
3.5
4.0
4.5
5.0
5.5
6.0

那么,如果我们指定的步长为0.7会怎么样呢?这种情况下,其数字序列不会大于上限值:

$ seq 3 0.7 6
3.0
3.7
4.4
5.1
5.8

打印递减序列

另一个用法是可以打印递减序列,为此,需要指定一个负的增量值,看下面的例子:

$ seq 6 -1 4
6
5
4

以上例子都是不带任何选项的使用方法,下面我们介绍几种带选项的用法。

打印相同格式(数字位数)的序列(-w)

选项 -w 可以让打印的数字序列保持相同的格式(数字位数)。如下例子:

$ seq -w 9 11
09
10
11

以特定格式打印序列(-f)

使用 选项 -f 可以指定序列的格式,让其格式化输出:

$ seq -f '##%g##' 3 5
##3##
##4##
##5##

上述命令中 %g 表示打印默认数字。另外,%e 表示以指数方式显示数字,%f 表示以浮点数方式显示。

以字符串作为分隔符的打印序列

seq 命令打印的序列中的每一个数字之间其实是有分隔符的,默认情况下,分隔符为换行符,所以上面的例子总是换行打印下一个数字。我们可以使用 -s 选项来指定分隔符。看下面的例子:

$ seq -s ':' 4
1:2:3:4

2、重定向与管道符

2.1 重定向

类型 设备文件 文件描述编号 默认设备
标准输入 /dev/stdin 0 键盘
标准输出 /dev/stdout 1 显示器
标准错误输出 /dev/stderr 2 显示器

交互式硬件设备

  • 标准输入:从该设备接收用户输入的数据

  • 标准输出:通过该设备向用户输出数据

  • 标准错误:通过该设备报告执行出错信息

重定向的意思就是 ,不通过标准输出到屏幕上,输出到你指定的位置

类型 操作符 用途
重定向输入 < 从指定的文件读取数据,而不是从键盘输入
重定向输出 1> 将输出结果保存到指定的文件(覆盖原有内容)
>> 将输出结果追加到指定的文件尾部  
标准错误输出 2> 将错误信息保存到指定的文件(覆盖原有内容)
2>> 标准错误输出结果追加到指定的文件尾部  
混合输出 &>无论对错都可以重定向 将标准输出、标准错误的内容保存到同一个文件中

提醒
常出现2>&1,这里需要再次提及反省自己

0、1、2——文件描述符
0:表示标准输入
1:表示标准输出,重定向不写数字时默认用“1”
2:表示标准错误 >,是替换、覆盖
>>,是追加 &>,是1&2>的缩写,意为把标准输出、标准错误输出重定向到一个文件下
&>后面只可以识别文件
>&,是唯一格式奇怪也能有用的重定向,功能与&>相同。可以识别文件,可以识别文件描述符。
后面接文件时,表示将标准输出和标准错误输出重定向至文件
后面接文件描述符时,表示将前面的文件描述符重定向至后面的文件描述符。 &,将任务提交到后台运行,jobs可以查看任务状态
&&,表示前一条命令执行成功后,才执行后一条命令,与 |,管道符,前一条命令的输出作为下一条命令的输入参数
||,表示前一条命令执行失败后,才执行后一项,或

引路人:(https://cloud.tencent.com/developer/article/2162194)

2.2 多行重定向

[root@31yml data]#wc -l <<EOF
> 123
> 456
> EOF#>是自动给的用于区别出输入内容,输入EOF作为结尾,固定格式
2#执行命令,反馈结果
cat > 文件名,在当前目录下若没有该文件就创建,覆盖编辑,Ctrl+D/Ctrl+c可以退出,推荐前者
cat >文件名<< EOF
EOF#再次输入表示结束
例子:
[root@31yml data]#cat >sol.txt
i am sol
[root@31yml data]#cat sol.txt
i am sol
[root@31yml data]#cat sol.txt<<EOF#不加重定向,也会进入输入状态,因为后者本身就有重定向功能
> 1
> 2
> 3
> EOF
i am sol
[root@31yml data]#cat sol.txt
i am sol [root@31yml data]#cat>>sol.txt<<abc#"EOF"只是个代号,作为开始、结束的标记,一致即可,内容无影响
> 1
> 2
> 3
> abc
i am sol
[root@31yml data]#cat sol.txt
i am sol
1
2
3
单行、多行注释
#单行注释——#
:'引号可单可双
多行注释
'

<< EOF头尾标记英文只起到符号作用
多行注释
EOF

2.3 管道符

管道符 |

将左侧的命令输出结果,作为右侧命令的输入(处理对象)可以 叠加使用

[root@31yml opt]#lscpu |wc
24 157 1297
修改密码
[root@localhost opt]# echo "123123" |passwd --stdin zhangsan
更改用户 zhangsan 的密码 。
passwd:所有的身份验证令牌已经成功更新 [root@test1 ~]# grep "/bin/bash$" /etc/passwd
root:x:0:0:root:/root:/bin/bash
zhangsan:x:1000:1000:zhangsan:/home/zhangsan:/bin/bash
lisi:x:1001:1001::/home/lisi:/bin/bash
[root@test1 ~]# grep "/bin/bash$" /etc/passwd | awk -F: '{print $1,$7}'
root /bin/bash
zhangsan /bin/bash
lisi /bin/bash

3、变量

3.1 变量基础

常见shell变量的类型:

自定义变量:由用户自己定义,修改和使用
环境变量:由系统维护,用于设置工作环境
只读变量:只可以读取不可以更改
位置变量:通过命令行给脚本传递参数
预定义变量:Bash中内置的一类变量,不能修改 有些规定好的变量 放在那里让你使用
3.1.1 命名要求
  • 区分大小写

  • 不能使程序中的保留字和内置变量:如:if, for,hostname,命令, 赋值语句(a=)

  • 只能使用数字、字母及下划线,且不能以数字开头,注意:不支持短横线 “ - ”,和主机名相反

  • 不要使用内置的变量,使用英文尽量使用词义通俗易懂,PATH

  • 大驼峰 StudentFirstName

  • 小驼峰 studentFirstName

  • 下划线 student_name

name='value'
变量名=变量值
直接字串:name='root'
变量引用:name="$USER"
命令引用:name=`某句命令` 或者 name=$(某句命令)
注意:变量赋值是临时生效,当退出终端后,变量会自动删除,无法持久保存,脚本中的变量会随着脚本结束,也会自动删除 #给变量赋值后要“引用”才能对值操作,不然就是把变量名当成字符操作
变量引用:
$name
${name} 弱引用和强引用
"$name " 弱引用,其中的变量引用会被替换为变量值
'$name ' 强引用,其中的变量引用不会被替换为变量值,而保持原字符串 #分隔变量值,方便引用变量
[root@localhost opt]# echo ${producet}$version
yml6.0
#例子
[root@31yml data]#a=yml
[root@31yml data]#echo $a
yml
[root@31yml data]#b=31
[root@31yml data]#echo $a$b
yml31
[root@31yml data]#echo $a31.31
.31

(“ ”双引号),直接调用变量

[root@31yml data]#echo "$a$b"
yml31

(‘ ’单引号),不会调用变量

[root@31yml data]#echo '$a$b'
$a$b

( ``反撇),提取命令执行后的输出结果,类似$()

[root@31yml data]#echo `cat 1.txt`
echo "1" echo "2" echo "3" <<EOF echo "4" echo "5" EOF
[root@31yml data]#echo 'cat 1.txt'
cat 1.txt

({ }大括号),可用分隔变量值

[root@31yml data]#echo ${a}31
yml31
[root@31yml data]#echo ${a}$b
yml31

变量追加值

格式:变量名+=追加值

[root@31yml data]#name=sol
[root@31yml data]#name+=·badguy
[root@31yml data]#echo $name
sol·badguy
#可以直接将新路径添加进PATH里
3.1.2 read -p

交互式,键盘输入的内容成为变量

read: read [-ers] [-a 数组] [-d 分隔符] [-i 缓冲区文字] [-n 读取字符数] [-N 读取字符数] [-p 提示符] [-t 超时] [-u 文件描述符] [名称 ...]
从标准输入读取一行并将其分为不同的域。 从标准输入读取单独的一行,或者如果使用了 -u 选项,从文件描
述 FD 中读取。该行被分割成域,如同词语分割一样,并且
第一个词被赋值给第一个 NAME 变量,第二个词被赋值给第二个
NAME 变量,如此继续,直到剩下所有的词被赋值给最后一个
NAME 变量。只有 $IFS 变量中的字符被认作是词语分隔符。 如果没有提供 NAME 变量,则读取的行被存放在 REPLY 变量中。 选项:
-a array 将词语赋值给 ARRAY 数组变量的序列下标成员,从
零开始。
-d delim 持续读取直到读入 DELIM 变量中的第一个字符,而不是
换行符
-e 在一个交互式 shell 中使用 readline 获取行
-i text 使用 TEXT 文本作为 readline 的初始文字
-n nchars 读取 nchars 个字符之后返回,而不是等到读取
换行符,但是分隔符仍然有效,如果遇到分隔符之前读
取了不足 nchars 个字符
-N nchars 在准确读取了 nchars 个字符之后返回,除非遇到
了文件结束符或者读超时,任何的分隔符都被忽略
-p prompt 在尝试读取之前输出 PROMPT 提示符并且不带
换行符
-r 不允许反斜杠转义任何字符
-s 不显示终端的任何输入
-t timeout 如果在 TIMEOUT 秒内没有读取一个完整的行则
超时并且返回失败。TMOUT 变量的值是默认的超时时间。
TIMEOUT 可以是小数。如果 TIMEOUT 是0,那么仅当在
指定的文件描述符上输入有效的时候,read 才返回成功。
如果超过了超时时间,则返回状态码大于128
-u fd 从文件描述符 FD 中读取,而不是标准输入
方法1
[root@localhost opt]# read -p "现在的时间是" time
现在的时间是9点
[root@localhost opt]# echo $time
9点 方法2
[root@localhost opt]# vim 1.sh
#!/bin/bash
echo -n "请输入你的信息"
read info
echo $info
3.1.3 变量作用范围

局部范围变量,默认情况下,新定义的变量只在当前的shell环境中有效,因此称为局部变量,当进入子程序或新的shell环境中,局部变量将无法再起作用。

全局范围变量,可以通过内部命令export将指定的变量为全局变量,使用户定义的变量在所子shell环境中可以继续使用

方法:

  1. 格式1:export 变量名

  2. 格式2:export 变量名=变量值

可以使用pstree 查看shell的环境

输入bash进入子shell

ctrl+D组合exit 退出子shell

[root@localhost opt]# abc=123
[root@localhost opt]# echo $abc
123
[root@localhost opt]# bash
[root@localhost opt]# echo $abc
为空
[root@localhost opt]# exit
exit
[root@localhost opt]# echo $abc
123
[root@localhost opt]# export abc
#export 变量名 定义全局变量
[root@localhost opt]# bash
[root@localhost opt]# echo $abc
123
3.1.4 整数的运算

1、expr只能进行整数的运算

格式: expr 变量1 运算符 变量2 [运算符 变量3]

加法  +
减法 -
乘法 \ *
除法 /
取余 (取模)%
#几种表达方式:
(1) let var=算术表达式
let sum=1+2
sum=1+2
(2) $((var=算术表达式)) 和上面等价
((sum=1+2))
echo $sum
(3) var= $[算术表达式]
(4) var=$((算术表达式))
(5) var=$(expr arg1 arg2 arg3 ...)
(6) var= `expr arg1 arg2 arg3 ...`
(7) echo '算术表达式' | bc
$[ ]
$(())
$(expr 1 2 3)

2、let,命令是一种用于进行算术运算的命令。它将表达式转换为整数并赋值给指定变量。在执行这个命令时,首先会将表达式进行解析,然后进行计算并将结果赋值给指定的变量。同时,还支持加减乘除等基本算术操作和取模运算。(详解:https://e.69525.com/a/417bc874c3702f8a/)

[root@31yml ~]#a=1
[root@31yml ~]#b=3
[root@31yml ~]#expr $a+$b
1+3
[root@31yml ~]#expr $a + $b
4
#注意空格 #random随机数的使用,random的范围在0-32767
#利用取模限定范围
$[RANDOM%34 +1]#此时范围在1-34 #自加符号位置不同,效果不同
[root@localhost ~]#i=100;let j=i++;echo $i $j
101 100
[root@localhost ~]#i=100;let j=++i;echo $i $j
101 101
#i++ 是先赋值给j后再加 ++i是加后再赋值 i++ 是先赋值再加
++i 是加后再赋值 #括号内也可运算
i=$(expr 12 \ * 5 )
i=$((12 * 5))
i=$[12 * 5]
let i=12*5 i++ 相当于 i=$[ $i+1 ]
i-- 相当于 i=$[ $i - 1 ]
i+=2 相当于 i=$[ $i+2 ]
#浮点数的运算需要使用bc
[root@localhost opt]# echo "1.2 + 1.3" |bc
2.5
[root@localhost opt]# echo "1.2*1.3" |bc
1.5
#只显示前两位
[root@localhost opt]# echo "scale=3;1.1*2.2" | bc
2.42

bc用法:

1、交互式

输入bc进入交互界面,好比进入计算器

2、echo+管道

echo "运算"|bc

3、bc+文件名

bc 文件绝对路径,文件里需要写上运算过程内容,内容出错,也会报错。

3.2 环境变量

  1. 由系统提前创建,用来设置用户的工作环境

  2. 可以使用env查看环境变量

  3. 需要记住的常用环境变量

环境变量:

  • 可以使子进程(包括孙子进程)继承父进程的变量,但是无法让父进程使用子进程的变量

  • 一旦子进程修改从父进程继承的变量,将会新的值传递给孙子进程

  • 一般只在系统配置文件中使用,在脚本中较少使用

# 可以看到所有
[root@31yml opt]#env
XDG_VTNR=1
SSH_AGENT_PID=1848
XDG_SESSION_ID=1
HOSTNAME=31yml
IMSETTINGS_INTEGRATE_DESKTOP=yes
VTE_VERSION=4602
TERM=xterm-256color
SHELL=/bin/bash
XDG_MENU_PREFIX=gnome-
HISTSIZE=1000
WINDOWID=29360134
IMSETTINGS_MODULE=IBus
USER=root
LS_COLORS=rs=0:di=38;5;27:ln=38;5;51:mh=44;38;5;15:pi=40;38;5;11:so=38;5;13:do=38;5;5:bd=48;5;232;38;5;11:cd=48;5;232;38;5;3:or=48;5;232;38;5;9:mi=05;48;5;232;38;5;15:su=48;5;196;38;5;15:sg=48;5;11;38;5;16:ca=48;5;196;38;5;226:tw=48;5;10;38;5;16:ow=48;5;10;38;5;21:st=48;5;21;38;5;15:ex=38;5;34:*.tar=38;5;9:*.tgz=38;5;9:*.arc=38;5;9:*.arj=38;5;9:*.taz=38;5;9:*.lha=38;5;9:*.lz4=38;5;9:*.lzh=38;5;9:*.lzma=38;5;9:*.tlz=38;5;9:*.txz=38;5;9:*.tzo=38;5;9:*.t7z=38;5;9:*.zip=38;5;9:*.z=38;5;9:*.Z=38;5;9:*.dz=38;5;9:*.gz=38;5;9:*.lrz=38;5;9:*.lz=38;5;9:*.lzo=38;5;9:*.xz=38;5;9:*.bz2=38;5;9:*.bz=38;5;9:*.tbz=38;5;9:*.tbz2=38;5;9:*.tz=38;5;9:*.deb=38;5;9:*.rpm=38;5;9:*.jar=38;5;9:*.war=38;5;9:*.ear=38;5;9:*.sar=38;5;9:*.rar=38;5;9:*.alz=38;5;9:*.ace=38;5;9:*.zoo=38;5;9:*.cpio=38;5;9:*.7z=38;5;9:*.rz=38;5;9:*.cab=38;5;9:*.jpg=38;5;13:*.jpeg=38;5;13:*.gif=38;5;13:*.bmp=38;5;13:*.pbm=38;5;13:*.pgm=38;5;13:*.ppm=38;5;13:*.tga=38;5;13:*.xbm=38;5;13:*.xpm=38;5;13:*.tif=38;5;13:*.tiff=38;5;13:*.png=38;5;13:*.svg=38;5;13:*.svgz=38;5;13:*.mng=38;5;13:*.pcx=38;5;13:*.mov=38;5;13:*.mpg=38;5;13:*.mpeg=38;5;13:*.m2v=38;5;13:*.mkv=38;5;13:*.webm=38;5;13:*.ogm=38;5;13:*.mp4=38;5;13:*.m4v=38;5;13:*.mp4v=38;5;13:*.vob=38;5;13:*.qt=38;5;13:*.nuv=38;5;13:*.wmv=38;5;13:*.asf=38;5;13:*.rm=38;5;13:*.rmvb=38;5;13:*.flc=38;5;13:*.avi=38;5;13:*.fli=38;5;13:*.flv=38;5;13:*.gl=38;5;13:*.dl=38;5;13:*.xcf=38;5;13:*.xwd=38;5;13:*.yuv=38;5;13:*.cgm=38;5;13:*.emf=38;5;13:*.axv=38;5;13:*.anx=38;5;13:*.ogv=38;5;13:*.ogx=38;5;13:*.aac=38;5;45:*.au=38;5;45:*.flac=38;5;45:*.mid=38;5;45:*.midi=38;5;45:*.mka=38;5;45:*.mp3=38;5;45:*.mpc=38;5;45:*.ogg=38;5;45:*.ra=38;5;45:*.wav=38;5;45:*.axa=38;5;45:*.oga=38;5;45:*.spx=38;5;45:*.xspf=38;5;45:
SSH_AUTH_SOCK=/run/user/0/keyring/ssh
SESSION_MANAGER=local/unix:@/tmp/.ICE-unix/1685,unix/unix:/tmp/.ICE-unix/1685
USERNAME=root
GNOME_SHELL_SESSION_MODE=classic
PATH=/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin:/root/bin
MAIL=/var/spool/mail/root
DESKTOP_SESSION=gnome-classic
QT_IM_MODULE=xim
QT_QPA_PLATFORMTHEME=qgnomeplatform
XDG_SESSION_TYPE=x11
PWD=/opt
XMODIFIERS=@im=ibus
LANG=zh_CN.UTF-8
GDM_LANG=zh_CN.UTF-8
GDMSESSION=gnome-classic
HISTCONTROL=ignoredups
XDG_SEAT=seat0
HOME=/root
SHLVL=2
GNOME_DESKTOP_SESSION_ID=this-is-deprecated
XDG_SESSION_DESKTOP=gnome-classic
LOGNAME=root
XDG_DATA_DIRS=/root/.local/share/flatpak/exports/share/:/var/lib/flatpak/exports/share/:/usr/local/share/:/usr/share/
DBUS_SESSION_BUS_ADDRESS=unix:abstract=/tmp/dbus-J0hSaTLK8O,guid=ca7c8e33f483eeec2fbb58e064db1c65
LESSOPEN=||/usr/bin/lesspipe.sh %s
WINDOWPATH=1
XDG_RUNTIME_DIR=/run/user/0
DISPLAY=:0
XDG_CURRENT_DESKTOP=GNOME-Classic:GNOME
COLORTERM=truecolor
XAUTHORITY=/run/gdm/auth-for-root-7pm6rz/database
_=/usr/bin/env
OLDPWD=/root $USER 表示用户名称
$HOME 表示用户的宿主目录
$LANG 表示语言和字符集
$PWD 表示当前所在工作目录
$PATH 表示可执行用户程序的默认路径

环境变量的全局配置文件在:

配置文件位置在/etc/profile,如果修改此文件会作用于所有用户

~/.bash_profile 用户独立的配置文件,修改这个文件只作用于当前用户

可以用来长期变更或设置环境变量

[root@localhost ~]# vim /etc/profile
.....................省略到行末添加
export PATH=$PATH:/root
source立即生效或 .
[root@localhost opt]# source /etc/profile 修改系统默认的命令数
[root@localhost opt]# echo $HISTSIZE
1000
[root@localhost opt]# vim /root/.bash_profile
export HISTSIZE=200
[root@localhost opt]# source /root/.bash_profile
[root@localhost opt]# echo $HISTSIZE
200

3.3 只读变量(readonly)

变量值不允许修改(重新赋值)的情况,无法用unset删除

(unset,用于删除环境变量或函数)

[root@localhost opt]# name=ky15
[root@localhost opt]# readonly name
[root@localhost opt]# echo $name
ky15
[root@localhost opt]# unset name
bash: unset: name: 无法反设定: 只读 variable
#只有退出进程
[root@localhost opt]# echo $name
ky15
[root@localhost opt]# name=ky
bash: name: 只读变量

3.4 位置变量

位置变量也称为位置参数,使用$1、$2、$3、…、$9 表示

 [root@test1 ~]# vim 1.sh      
 #!/bin/bash
 echo "$1"           位置1
 echo "$2"           位置2
 echo "${10}"         位置10#$[10]=10;${10}指代第十位参数
 echo "$10"           位置1和0
 echo "$*"           将所有项当成一个值
 echo "$@"           所有项
 echo "$0"           脚本自身
 echo "$#"           后面参数的个数
 [root@31yml opt]#bash 1.sh {2..11}
 2
 3
 11
 20
 2 3 4 5 6 7 8 9 10 11
 2 3 4 5 6 7 8 9 10 11
 1.sh
 10
 ​
 $0 表示当前的脚本名称
 ​
 [root@test1 ~]# vim weizhi.sh
 #!/bin/bash
 sum=`expr $1 + $2`
 echo "$1+$2=$sum"
 [root@test1 ~]# chmod +x weizhi.sh
 [root@test1 ~]# ./weizhi.sh 12 34 56
 12+34=46
 [root@test1 ~]#cat qiuhe.sh
 #!/bin/bash
 i=$1
 m=$2
 sum=0
 let sum=$[i+m]
 echo $sum

3.5 预定义变量

  • $*:表示所有位置参数的内容看成一个整体返回,返回所有

  • $@:表示所有位置参数的内容分割成n份,每份作为一个独立的个体返回,返回所有

  • $?:表示前一条命令执行后的返回状态,返回值为 0 表示执行正确,返回任何非 0值均表示执行出现异常

  • $#:表示命令行中位置参数的总个数

  • $0:表示当前执行的脚本或程序的名称 当前脚本的名字

  • $$:当前进程id

  • $!: 后台任务最后一个id

 [root@31yml opt]# cat 3.sh
 #区别 $* 和 $@
 #!/bin/bash
 echo "打印出\$*"
 for var in "$*"
 do
 echo "$var"
 done
 ​
 ​
 echo "打印出\$@"
 for var in "$@"
 do
 echo "$var"
 done
 ​
 [root@31yml opt]#bash 3.sh 1 2 3
 打印出$*
 1 2 3
 打印出$@
 1
 2
 3
 

````

shell脚本之规范与变量的更多相关文章

  1. Shell脚本开发规范

    一.前言 由于工作需要,最近重新开始拾掇shell脚本.虽然绝大部分命令自己平时也经常使用,但是在写成脚本的时候总觉得写的很难看.而且当我在看其他人写的脚本的时候,总觉得难以阅读.毕竟shell脚本这 ...

  2. shell脚本中特定符合变量的含义

    shell脚本中特定符合变量的含义: $#   传递到脚本的参数个数 $*    以一个单字符串显示所有向脚本传递的参数.与位置变量不同,此选项参数可超过9个 $$    脚本运行的当前进程PID号 ...

  3. shell脚本编写规范和相关变量类型

    shell编程规范与变量    一.shell脚本概述    ① 什么是shell? Linux中有哪些shell?    ② shell的作用   ③ 用户的登录shell    ④ shell脚本 ...

  4. Shell脚本书写规范

    在日常的运维工作中,Shell脚本肯定是必不可少的工作内容.为方便问题排查.脚本执行历史问题追踪.方便大家共同维护,从网上搜罗结合以往的经验教训拟定以下Bash脚本书写规范.欢迎各位同学指正或补充. ...

  5. 编写shell脚本的规范

    目录 编写shell脚本的一些规范 解释器 添加脚本版本和注释功能 添加脚本调试 变量命名 全局变量和局部变量 命名规范 函数命名 脚本命名 函数 引用模块或文件 脚本日志 配置文件 其他 编写she ...

  6. 【Shell Basic】Shell脚本编写规范

    shell脚本需要有较高的实用性.可维护.可阅读.方便他人阅读,因而需要建立一定的规范来操作 dream361@master:~$ cat test2.sh #!/bin/bash 所使用的bash程 ...

  7. shell脚本中一些特殊变量

    在shell脚本中,一些常见的特殊变量表示方式还是需要知道的 如下就是一些经常用到的特殊变量表示方法: $0    当前脚本名$1 $2...    传入脚本or函数的参数(大于10需大括号括起来)$ ...

  8. Shell脚本编写2------有关变量

    shell脚本中变量定义方式十分简单,直接将值赋值给变量较好例如 :name="tuanzhang"注意,变量名和等号之间不能有空格,这可能和你熟悉的所有编程语言都不一样.变量命名 ...

  9. Shell脚本编写规范

    shell脚本需要有较高的实用性.可维护.可阅读.方便他人阅读,因而需要建立一定的规范来操作 dream361@master:~$ cat test2.sh #!/bin/bash 所使用的bash程 ...

  10. shell脚本—基础知识,变量

    shell脚本本质: 编译型语言 解释型语言 shell编程基本过程 1.建立shell文件 2.赋予shell文件执行权限,使用chmod命令修改权限 3.执行shell文件 shell变量: sh ...

随机推荐

  1. 一张表实现类某音的视频"评论回复"功能

    ​前言 现如今,不管是哪种类型的应用,评论区都少不了.从工具类的到媒体信息流类的,评论留言都是最基本的互动环节.比如抖音短视频下,针对视频每个用户都可以发表自己的观点:而针对用户的评论,其他的用户又可 ...

  2. CSRF与SSRF

    CSRF与SSRF CSRF(跨站请求伪造) 跨站请求伪造(Cross-site request forgery,CSRF),它强制终端用户在当前对其进行身份 验证后的Web应用程序上执行非本意的操作 ...

  3. 用 Vue.js 实现一个 JSON Viewer

    演示地址: http://json.imlht.com/vue-json-viewer-demo.html 常用的 JSON 格式化工具 JSON 是一种轻量级的数据交换格式, 相信大家用得比较多, ...

  4. locust与jmeter测试过程及结果对比

    JMeter和Locust都是强大的性能测试工具,各自拥有自己的优势和专注领域.JMeter提供了全面的功能和基于GUI的界面,适用于复杂的场景和非技术人员.相比之下,Locust采用了以代码为中心的 ...

  5. 通过Maxwell同步mariadb数据至kafka

    实验环境 本地虚拟机 maraidb 10.8.8 kafka 2.12-3.3.1 maxwell由容器部署 1 mariadb 1.1 配置log_bin 配置文件中加入如下内容 server-i ...

  6. Redis解决网络抖动问题

    Redis解决网络抖动问题 所谓网络抖动问题, 简单来说就是防止用户短暂的时间内对同一个接口多次点击访问 这里利用的是redis锁的原子性和with Statement上下文管理器实现, 另外该类还支 ...

  7. CRM系统化整合从N-1做减法实践

    1 背景 京销易系统已经接入大网.KA以及云仓三个条线商机,每个条线商机规则差异比较大,当前现状是独立实现三套系统分别做支撑. 2 目标 2022年下半年CRM目标是完成9个新条线业务接入,完成销售过 ...

  8. while(1) ; CPU 会一直等下去吗

    标题答疑 不会,计算机从外部设备读取数据到存储器,每读取1word的数据,CPU对外设状态进行一次检查. 可能有小伙伴看到这就要退出了,别急,看下去或许会有收获. 首先解决第一个问题:一个字是多少字节 ...

  9. 王道oj/problem12(动态申请内存存储数组)

    网址:http://oj.lgwenda.com/problem/12 思路:用输入的整型创建对应数组,用scanf消除换行键: 用gets()输入语句并输出,再释放. 代码: #define _CR ...

  10. .NET技术:懒惰与沉淀的平衡之道

    在过去的很多年里,我一直默默搬砖,而我们聚在博客园,目的只有一个:沉淀并为更多的.NET开发者提供更好的帮助. 疫情3年,个人经历了太多事情,感觉懒惰是最大的敌人.然而,在这里,我收获了许多宝贵的经验 ...