1 自定义变量
[root@nsd2309 opt]# a=10						//等号两边不能有空格,变量名称可以用数字、字母、下划线,不能以数字开头,不能用特殊符号
[root@nsd2309 opt]# echo $a					//查看变量(调用变量)
10
[root@nsd2309 opt]# echo ${a}RMB			//使用{}可以防止与后续的字符混淆
10RMB

[root@nsd2309 opt]# unset a						//撤销变量的值
[root@nsd2309 opt]# echo $a
2 环境变量
2.1 当前用户的环境变量:

UID:当前用户的id号

USER:当前的用户名

HOME:当前用户的家目录

SHELL:当前用户的登录解释器

HOSTNAME:当前的主机名

[root@nsd2309 opt]# echo $UID $USER $HOME $SHELL
0 root /root /bin/bash
2.2 环境变量PS1

表示Shell环境的一级提示符,

即命令行提示符(\u 用户名、\h 主机名、\W 工作目录、\$ 权限标识):

[root@nsd2309 opt]# echo $PS1
[\u@\h \W]\$

[root@nsd2309 opt]# PS1='hehe#'
hehe#
hehe#PS1='[\u@\h \W]\$'
[root@nsd2309 opt]#
2.3 环境变量PS2

表示二级提示符,

出现在强制换行场合:

[root@nsd2309 ~]#cd \					//进入二级提示,表示用户没有输入完成
> /opt/												//输入文件或目录,作为之前的cd命令的路径
[root@nsd2309 opt]#cd \
> /root/
[root@nsd2309 ~]#PS2='=>'			//修改二级提示符的符号样式
[root@nsd2309 ~]#cd \
=> /opt/
[root@nsd2309 opt]#PS2='>'
2.4 环境变量预存路径PATH
[root@nsd2309 ~]#echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin			//环境变量预存路径

可以把变量放入/etc/profile,对所有用户有效;

放入~/.bash_profile,仅对指定的用户有效

使用env可查看所有环境变量,

使用set可查看所有变量

3 位置变量与预定义变量

创建一个测试脚本,用来展示

[root@nsd2309 opt]#vim location.sh
#!/bin/bash
echo $0                                        #脚本的名称,source运行脚本时显示解析器
echo $1                                        #脚本后面的第一个参数
echo $2                                        #第二个参数
echo $*                                        #所有参数
echo $#                                        #所有参数的个数
echo $$                                        #当前进程的进程号
echo $?  																			#上一个程序的返回状态码
[root@nsd2309 opt]#chmod +x location.sh				#添加可执行权限

[root@nsd2309 opt]#./location.sh a b c d			#执行脚本location.sh  查看显示结果
./location.sh
a
b
a b c d
4
6611
0

注:$?——判断上一个程序执行是否成功,成功返回0,失败返回非0,如下案列所示:

[root@nsd2309 opt]#ls
first.sh  location.sh
[root@nsd2309 opt]#echo $?
0

[root@nsd2309 opt]#ls gagawraw
ls: 无法访问'gagawraw': 没有那个文件或目录
[root@nsd2309 opt]#echo $?
2
[root@nsd2309 opt]#echo $?
0
4 测试变量的应用-创建账户与修改密码的脚本

首先编写一个创建账户tom,密码123456的脚本,然后通过下列方式改进

编写脚本

[root@nsd2309 opt]#vim user.sh
 #!/bin/bash
 useradd $1
 echo "$2" |passwd --stdin $1

执行脚本测试:

[root@nsd2309 opt]#./user.sh tom 123456
 更改用户 tom 的密码。
 passwd: 所有的身份验证令牌已经成功更新。
5 变量的扩展应用
5.1 三种引号对赋值的影响

(1)双引号的应用:界定一个完整字符串

[root@nsd2309 opt]#xx=a b c
bash: b: 未找到命令...
[root@nsd2309 opt]#xx="a b c"
[root@nsd2309 opt]#touch a aa
[root@nsd2309 opt]#touch "a aa"
[root@nsd2309 opt]#ls
 a   aa  'a aa'   first.sh   location.sh   user.sh
[root@nsd2309 opt]#

(2)单引号的应用:界定一个完整的字符串,并且可以实现屏蔽特殊符号的功能

[root@nsd2309 opt]#a=100
[root@nsd2309 opt]#echo "$a"
100
[root@nsd2309 opt]#echo '$a'
$a
[root@nsd2309 opt]#

(3)反撇号或$()的应用:将命令执行的标准输出作为字符串存储,因此称为命令替换。

[root@nsd2309 opt]#a=date
[root@nsd2309 opt]#echo $a
date

[root@nsd2309 opt]#b=`date`
[root@nsd2309 opt]#echo $b
2023年 11月 01日 星期三 16:15:44 CST

[root@nsd2309 opt]#c=$(date)		//效果同上,执行date命令,并将执行结果赋值给c
[root@nsd2309 opt]#echo $c
2023年 11月 01日 星期三 16:16:46 CST

[root@nsd2309 opt]#echo $(date)
2023年 11月 01日 星期三 16:21:54 CST
[root@nsd2309 opt]#
5.2 使用read命令从键盘读取变量值

(1)read脚本用法

执行后从会等待并接受用户输入(无任何提示的情况),并赋值给变量:

[root@nsd2309 opt]# read str
hello word   																	#随便输入一些文字,按Enter键提交
[root@nsd2309 opt]# echo $str                  #查看赋值结果
hello word

-p选项给出友好提示:

[root@nsd2309 opt]#read -p "请给变量赋值:" i
请给变量赋值:100
[root@nsd2309 opt]#echo $i
100

结合之前的脚本

[root@nsd2309 opt]vim user.sh
#!/bin/bash
read -p "请输入用户名"  u  	 #-p是可以定义提示信息,u相当于自定义变量名称,可以存储用户看到提示信息后输入的字符
useradd $u
read -p "请输入密码"  n
echo "$n" | passwd --stdin $u

(2)stty终端显示控制

回显功能关闭(stty -echo):将输入的信息或命令不显示在终端

回显功能恢复(stty echo)

[root@nsd2309 opt]# ls
 a   aa  'a aa'   first.sh   location.sh   user.sh
[root@nsd2309 opt]# stty -echo
[root@nsd2309 opt]#  a   aa  'a aa'   first.sh   location.sh   user.sh
记得输入stty echo关闭回显

之前脚本再次改良:

[root@nsd2309 opt]vim user.sh
#!/bin/bash
 read  -p  "请输入用户名"  u
 useradd  $u
 stty  -echo
 read  -p  "请输入密码"  n
 stty  echo
 echo  "$n" | passwd  --stdin  $u
5.3 使用export发布全局变量

默认情况下,自定义的变量为局部变量,只在当前Shell环境中有效,而在子Shell环境中无法直接使用。

[root@nsd2309 opt]# a=10
[root@nsd2309 opt]# echo $a 								#查看a变量的值,有值
10

[root@nsd2309 opt]# bash										#开启bash子进程
[root@nsd2309 opt]# stty echo								#查看a变量的值,无值
[root@nsd2309 opt]# exit										#返回原有Shell环境
exit

[root@nsd2309 opt]# echo $a									#再次查看,有值
10

若希望定义的变量能被子进程使用:

[root@nsd2309 opt]# export a=100                #发布已定义的变量

验证刚刚发布的全局变量:

[root@nsd2309 opt]# bash                     #进入bash子Shell环境
[root@nsd2309 opt]# echo $a
100

[root@nsd2309 opt]pstree | grep bash				#查看开启的子进程
        |-sshd---sshd---sshd-+-bash---bash-+-grep	  #一个bash是父进程,多余的是子进程所在
        |         |-gnome-terminal--+-bash
        
      
[root@nsd2309 opt]# exit				#退出子进程  
exit
[root@nsd2309 opt]# pstree | grep bash
        |-sshd---sshd---sshd-+-bash-+-grep				#剩下一个父进程
        |         |-gnome-terminal--+-bash
[root@nsd2309 opt]#














阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6
标签: shell