一、Bash环境变量
bash中变量有四种种类型:环境变量、本地变量(局部变量)、位置变量、特殊变量。
1.环境变量
环境变量作用范围最广,所有子bash进程都能够访问环境变量中的值,定义环境变量的方法是使用export关键字。举例:
kdyzm@kdyzm:~$ export A=abckdyzm@kdyzm:~$ echo $Aabckdyzm@kdyzm:~$
2.本地变量
本地变量作用范围是当前bash,子bash访问不到父bash中定义的变量,定义本地变量的方法是 VARNAME=value。举例:
kdyzm@kdyzm:~$ B=cdekdyzm@kdyzm:~$ echo $Bcdekdyzm@kdyzm:~$
局部变量是本地变量的一种特殊形式,作用域更小,它只能在方法中使用,使用关键字local定义。
3.位置变量
位置变量的作用类似于正则表达式中的后项引用,正则表达式中使用"\n"来引用,这里使用"$n"来引用。
4.特殊变量
特殊变量叶叫做“系统变量”,这种类别的变量是bash自己定义的变量,比如$?就是一种特殊变量(系统变量),它用来保存上一条命令的执行结果,0代表执行成功,其它(1-255)代表执行失败
kdyzm@kdyzm:~$ ls /tmpconfig-err-YXMEYjfcitx-socket-:0orbit-kdyzmsni-qt_sogou-qimpanel_1597-Mn3jk9sogou-qimpanel:0.pidsogou-qimpanel-cellsogou-qimpanelkdyzmsystemd-private-251274e9dff14256aadaac748704e759-colord.service-Q7u1posystemd-private-251274e9dff14256aadaac748704e759-rtkit-daemon.service-I81zdWsystemd-private-251274e9dff14256aadaac748704e759-systemd-timesyncd.service-SrkrjYunity_support_test.0kdyzm@kdyzm:~$ echo $?0kdyzm@kdyzm:~$ ls /templs: cannot access /temp: No such file or directorykdyzm@kdyzm:~$ echo $?2kdyzm@kdyzm:~$
二、如何实现变量引用
使用${VARNAME}实现变量引用,其中大多数情况下{}能够直接省略,不能省略的情况:
kdyzm@kdyzm:~$ ANIMAL=pigkdyzm@kdyzm:~$ echo "there are some ${ANIMAL}s"there are some pigskdyzm@kdyzm:~$
以上echo命令之后必须使用"",而不能使用'',这是因为""是弱引用,变量能够被解析,''是强引用,变量不能被解析。
kdyzm@kdyzm:~$ echo 'there are some ${ANIMAL}s'there are some ${ANIMAL}skdyzm@kdyzm:~$
三、杂项
1.如果脚本是在命令行中执行的,那么该脚本能够直接访问当前shell定义的变量,但是如果是非命令行运行的脚本,就必须手动配置环境变量了。
2./dev/null是一个数据黑洞,可以将不需要显示的数据都重定向到这里丢弃掉。
3.使用unset命令能够解除变量绑定,释放内存空间。
4.如何查看当前shell的环境变量
使用printenv、env、export三个命令都能够查看当前bash中的环境变量。
5.如何运行一个脚本
指定脚本的路径,回车即可。需要注意的是如果脚本文件在当前路径下,也需要指定./作为当前路径的标志,否则直接使用文件名会提示找不到命令,原因就是命令行默认认为你输入的是命令,所以回到PATH路径下找,结果没找到,就会报错。
kdyzm@kdyzm:~$ command.shcommand.sh: command not foundkdyzm@kdyzm:~$ ./command.sh Hello,World!
注意创建脚本文件之后一定要加上“可执行”权限,因为默认创建的文本文件是不可执行的。
chmod a+x ./command.sh
如果不想给脚本文件加上可执行权限但是还想要执行该脚本的话,直接使用
bash FILE
即可执行。
四、如何写一个脚本
在写一个脚本之前必须指定“魔数”,指定魔数的作用就是告诉系统到哪里去找“解析器”解析脚本内容,在使用bash的情况下,指定魔数的方法是:
#! /bin/bash
接下来就是一些命令的堆砌,实际上脚本编程就是那么简单。
五、条件测试
1.条件测试类型包括整数测试、字符测试、文件测试
2.条件测试的三种命令
[ expression ][[ expression ]] #}"[["是bash中的关键字,而[不是test expression
3.整数比较的操作符
-eq #测试两个数是否相等-ne #测试两个书是否不想等-lt #小于比较测试-gt #大于比较测试-le #小于等于测试-ge #大于等于测试
4.命令之间的逻辑关系
&& #与关系|| #或关系
六、条件判断
1.条件判断的结构如下:
if 判断条件;then statement1 statement2elif statement3 statement4 else statement5 statement6fi
2.判断命令执行结果返回值还是判断命令执行状态返回值
命令执行结果返回值:命令执行的返回值
命令执行状态返回值:只有两个结果,一个是0表示执行成功,非0表示执行失败,使用$?可以查看改值。
举例:该处的判断条件判断的是命令执行状态返回值
#! /bin/bashif id user2 &> /dev/null;then echo "user1存在!"else echo "user1不存在!"fi
七、练习
1.给出一个用户名,判断该用户是管理员还是普通用户
#! /bin/bashNAME=kdyzmUSERID=`id -u $NAME`if [ $USERID -eq 0 ] ;then echo "Admin User"else echo "Common User"fi
2.编写一个脚本,判断是否有用户的默认shell为bash,如果有,则显示有多少个这类用户,否则就显示没有这类用户。
#! /bin/bashUSERS=`grep "bash$" /etc/passwd | wc -l`if [ $USERS -eq 0 ] ;then echo "没有默认shell为bash的用户存在!"else echo "使用bash为默认shell的用户数量为:$USERS"fi