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
脚本的构成(三大块)
-
脚本申明(解释器):第一行开头“#!/bin/bash”,表示此行以下的代码语句是通过/bin/bash程序来解释执行。#!/bin/bash为默认的解释器还有其他类型的解释器,#!/bin/python #!/bin/expect
-
注释信息:以#开头的语句表示为注释信息
-
可执行语句:比如echo命令用于输出“ ”之间的字符串
1.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:export 变量名
-
格式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 环境变量
-
由系统提前创建,用来设置用户的工作环境
-
可以使用env查看环境变量
-
需要记住的常用环境变量
环境变量:
-
可以使子进程(包括孙子进程)继承父进程的变量,但是无法让父进程使用子进程的变量
-
一旦子进程修改从父进程继承的变量,将会新的值传递给孙子进程
-
一般只在系统配置文件中使用,在脚本中较少使用
# 可以看到所有
[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
````
标签:脚本,13,shell,变量,echo,31yml,38,root From: https://www.cnblogs.com/bacolate/p/17644118.html