首页 > 系统相关 >shell脚本之规范与变量

shell脚本之规范与变量

时间:2023-08-20 16:13:01浏览次数:62  
标签:脚本 13 shell 变量 echo 31yml 38 root

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>> 标准错误输出结果追加到指定的文件尾部  
混合输出 &>无论对错都可以重定向 将标准输出、标准错误的内容保存到同一个文件中

image-20230809184943301

image-20230809185002143

提醒
常出现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
单行、多行注释
#单行注释——#
:'引号可单可双
多行注释
'

image-20230815192058508

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

image-20230815192141252

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
 

````

标签:脚本,13,shell,变量,echo,31yml,38,root
From: https://www.cnblogs.com/bacolate/p/17644118.html

相关文章

  • C++ 变量初始化总结
    堆空间,new操作初始化1、对于有自己写构造函数的类,不论类型名后面有没有括号()或者数组[],都用构造函数进行初始化,如果构造函数delete,则编译报错;2、如果没有构造函数,则不加括号的new只分配内存空间,不进行内存的初始化,3、而加了括号()的new会在分配内存的同时初始化为0。栈空间......
  • linux shell 条件语句和循环结构
    条件语句和循环结构在Shell脚本中用于控制程序的流程,让你可以根据条件决定执行不同的代码块,或者重复执行某些代码。下面是条件语句和循环结构的一些示例和说明:**条件语句:**1.**if语句**:使用`if`语句根据条件执行不同的代码块。if["$age"-gt18];thenecho"成年"el......
  • linux shell 函数与脚本调试
    **函数:**1.**函数定义**:使用`function`关键字或者直接写函数名来定义函数。functionmy_function(){echo"函数内容"}my_function(){echo"函数内容"}2.**函数调用**:直接使用函数名来调用函数。my_function3.**函数参数**:可以在函数中使用参数来传递值。......
  • PHP下的webshell免杀
    异或免杀大多数情况下,开发者为了方便自身的需求,会使用"黑名单"的方式扳掉许多敏感函数,来达到一个表面看上去新相对安全的一个目的,但是却不知道因为这种大意的思维会导致整个系统都处于极度危险中;攻击者以往遇见这种情况。完全可以通过加密的方法可以解决大部分的问题(eg:异或加密,ba......
  • shell脚本基础
    基础命令示例#!/bin/bash固定格式echo"inputstr"输出字符串到屏幕read变量名读取键盘输入test$first==$second&&echo"dengyv"||echo"notdeng"判断字符串是否相等echo"filename"$0。脚本名称echo"totalparamnum"$#。参数个数echo......
  • JavaScript中的类型、值和变量
    JavaScript的类型可以分为两个主要组别:原始类型和对象类型。JavaScript的原始类型包括数字、文本字符串(简称为字符串)和布尔值(也称为布尔值)。特殊值null和undefined也是原始值,但它们不是数字、字符串或布尔值。这两个值通常被视为各自类型的独特成员。ES6引入了另一种特殊类型,称为......
  • 红帽认证RedHat-RHCSA shell的基本应用用户和组管理网络配置和防火墙管理笔记汇总
    shell命令概述Shell作用:命令解释器介于操作系统内核与用户之间,负责解释命令行获得命令帮助内部命令help命令的“--help”选项使用man命令阅读手册页命令行编辑的几个辅助操作Tab键:自动补齐反斜杠“\”:强制换行快捷键Ctrl+U:清空至行首快捷键Ctrl+K:清空至行尾快捷键Ctr......
  • shell命令概述 Shell作用:命令解释器 介于操作系统内核与用户之间,负责解释命令行 获得
    shell命令概述Shell作用:命令解释器介于操作系统内核与用户之间,负责解释命令行获得命令帮助内部命令help命令的“--help”选项使用man命令阅读手册页命令行编辑的几个辅助操作Tab键:自动补齐反斜杠“\”:强制换行快捷键Ctrl+U:清空至行首快捷键Ctrl+K:清空至行尾快捷键Ctr......
  • 今天玩虚拟机突然xshell连不上了,解决方案如下
    之前配置的集群一点事都没有,当时正巧我的idea就跟吃了屎一样,maven一直连不上,当时把C盘的Host文件前两行注释解掉,后来发现hadoop集群也用不了了,然后我也是头铁,硬找了俩小时错,强迫症犯了,最后再网上找了一份方案。我是把ens-33。bak这个备份文件删了就行了。当时可能就是因为host回环......
  • 变量
    变量1.常量和变量intval2=100;intval_2=100;见名知意inta=19;intage=19;intheight=182;intweight=150;intnianling=19;inttizhong=150;驼峰-下划线驼峰-WindowsintstuAge=19;intcreateDigWindow(void);下划线-Linuxintst......