Shell变量的使用
阿里云国内75折 回扣 微信号:monov8 |
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6 |
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 |