一、Bash环境变量

bash中变量有四种种类型:环境变量、本地变量(局部变量)、位置变量、特殊变量。

1.环境变量

环境变量作用范围最广,所有子bash进程都能够访问环境变量中的值,定义环境变量的方法是使用export关键字。举例:

kdyzm@kdyzm:~$ export A=abc
kdyzm@kdyzm:~$ echo $A
abc
kdyzm@kdyzm:~$

 2.本地变量

本地变量作用范围是当前bash,子bash访问不到父bash中定义的变量,定义本地变量的方法是 VARNAME=value。举例:

kdyzm@kdyzm:~$ B=cde
kdyzm@kdyzm:~$ echo $B
cde
kdyzm@kdyzm:~$

局部变量是本地变量的一种特殊形式,作用域更小,它只能在方法中使用,使用关键字local定义。

 3.位置变量

位置变量的作用类似于正则表达式中的后项引用,正则表达式中使用"\n"来引用,这里使用"$n"来引用。

 4.特殊变量

特殊变量叶叫做“系统变量”,这种类别的变量是bash自己定义的变量,比如$?就是一种特殊变量(系统变量),它用来保存上一条命令的执行结果,0代表执行成功,其它(1-255)代表执行失败

kdyzm@kdyzm:~$ ls /tmp
config-err-YXMEYj
fcitx-socket-:0orbit-kdyzm
sni-qt_sogou-qimpanel_1597-Mn3jk9
sogou-qimpanel:0.pid
sogou-qimpanel-cell
sogou-qimpanelkdyzm
systemd-private-251274e9dff14256aadaac748704e759-colord.service-Q7u1po
systemd-private-251274e9dff14256aadaac748704e759-rtkit-daemon.service-I81zdW
systemd-private-251274e9dff14256aadaac748704e759-systemd-timesyncd.service-SrkrjY
unity_support_test.0
kdyzm@kdyzm:~$ echo $?0kdyzm@kdyzm:~$ ls /templs: cannot access /temp: No such file or directory
kdyzm@kdyzm:~$ echo $?2kdyzm@kdyzm:~$

二、如何实现变量引用

使用${VARNAME}实现变量引用,其中大多数情况下{}能够直接省略,不能省略的情况:

kdyzm@kdyzm:~$ ANIMAL=pig
kdyzm@kdyzm:~$ echo "there are some ${ANIMAL}s"
there are some pigs
kdyzm@kdyzm:~$

以上echo命令之后必须使用"",而不能使用'',这是因为""是弱引用,变量能够被解析,''是强引用,变量不能被解析。

kdyzm@kdyzm:~$ echo 'there are some ${ANIMAL}s'
there are some ${ANIMAL}s
kdyzm@kdyzm:~$

三、杂项

    1.如果脚本是在命令行中执行的,那么该脚本能够直接访问当前shell定义的变量,但是如果是非命令行运行的脚本,就必须手动配置环境变量了。

    2./dev/null是一个数据黑洞,可以将不需要显示的数据都重定向到这里丢弃掉。

    3.使用unset命令能够解除变量绑定,释放内存空间。

    4.如何查看当前shell的环境变量

        使用printenv、env、export三个命令都能够查看当前bash中的环境变量。

    5.如何运行一个脚本

        指定脚本的路径,回车即可。需要注意的是如果脚本文件在当前路径下,也需要指定./作为当前路径的标志,否则直接使用文件名会提示找不到命令,原因就是命令行默认认为你输入的是命令,所以回到PATH路径下找,结果没找到,就会报错。

kdyzm@kdyzm:~$ command.sh
command.sh: command not found
kdyzm@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
    statement2
elif    
    statement3
    statement4    
else
    statement5
    statement6
fi

    2.判断命令执行结果返回值还是判断命令执行状态返回值

        命令执行结果返回值:命令执行的返回值

        命令执行状态返回值:只有两个结果,一个是0表示执行成功,非0表示执行失败,使用$?可以查看改值。

        举例:该处的判断条件判断的是命令执行状态返回值

#! /bin/bash
if id user2 &> /dev/null;then
        echo "user1存在!"
else
        echo "user1不存在!"
fi

七、练习

    1.给出一个用户名,判断该用户是管理员还是普通用户

#! /bin/bash
NAME=kdyzm
USERID=`id -u $NAME`
if [ $USERID -eq 0 ] ;then
        echo "Admin User"
else
        echo "Common User"
fi

    2.编写一个脚本,判断是否有用户的默认shell为bash,如果有,则显示有多少个这类用户,否则就显示没有这类用户。

#! /bin/bash
USERS=`grep "bash$" /etc/passwd | wc -l`
if [ $USERS -eq 0 ] ;then
        echo "没有默认shell为bash的用户存在!"
else
        echo "使用bash为默认shell的用户数量为:$USERS"
fi