在介绍内容之前,我解释下排版问题,

第一分割线是基本介绍

第二分割线是细节和扩展内容

第三分割线是对细节内容的详细讲解以及实例

前面粗略介绍的后面会有详解



bash的重要特性:变量

        

bash变量的类别:


            本地变量:只对当前shell进程有效的变量:对其他shell进程无效,包当前shell进程的子进程:

                    

            环境变量:对当前shell进程及其子shell有效,对其他的shell进程无效

            局部变量:对shell脚本中某代码片段有效,通常用于函数本地


            位置变量:使用bash 脚本时,命令后面跟着的参数位置

            特殊变量:在bash中,有单独意义的特别变量(详情见下文扩展)

                        如  $?:上一个命令结束后的状态

                  

变量定义:


            定义本地变量:变量名=值


            定义环境变量:export 变量名=值

                    对于已有的本地变量,改成环境变量:export 变量名  即可。


            定义局部变量:local 变量名=值

    

    撤销变量:unset 变量名


变量引用:


                $ 变量名:可以引用变量的值

              $ "变量名":(双引号)    弱应用,引用的是变量的值。

                $ '变量名':(单引号)    强引用,引号中的字符不做变量替换,直接引用字符。


系统变量:

            系统变量只是我自己叫的名字,实际就是bash配置文件中,永久生效的变量。上文中自己设置的变量,在退出shell的时候就会失效,要希望设置的变量永久生效就需要配置相关的配置文件。下文会介绍bash配置文件。这里只介绍系统一些常用变量:

            PATH 决定了shell将到哪些目录中寻找命令或程序 (后文有详解)
            HOME 当前用户主目录
            HISTSIZE 历史记录数
            LOGNAME 当前用户的登录名
            HOSTNAME 指主机的名称
            SHELL 当前用户Shell类型
            LANGUGE  语言相关的环境变量,多语言可以修改此环境变量
            MAIL 当前用户的邮件存放目录
            PS1 基本提示符,对于root用户是#,对于普通用户是$ 

            




相关命令:


    查看当前shell进程中的所有变量

            set:

    查看当前shell进程中的所有环境变量

            export

            printenb

            env




变量命名规则


        1、不能使用shell脚本程序中的关键子(保留字);

                    如:if,case,for

        2、只能使用数字、字母和下划线,且不能以数字开头

        3、要见名知义(额外要求)







细节和扩展

bash有许多内置的环境变量




特殊变量:(后文有实例→点击)


   $?:上一个程序结束状态返回值

   $#:位置参数个数

    $*:引用所有位置参数    

   $@:引用所有位置参数

    $$:脚本的进程ID(PID)

    $!:shell最后运行的后台Process的PID

   

常量:

    readonly 变量:

    只有shell进程终止,常量才能释放,不然无法修改



给变量默认值

    varName=${varName;-value}

                如果varName不空,则返回varName的值:否则,则返回value,(注意:varName并没有被赋值)

                如果varName不空,则其值不变,否则,varName会使用value作为其值。


变量值类型:


变量类型:

        不通的类型,不同的存储机制

                    1、存储机制

                    2、存储空间

                    3、参与的运算方式




    数值型:

                精确数值:整数

                近似数据:浮点型

                    单精度浮点

                    双精度浮点

    字符型:

                char(单个字符)

                string(字串)

                布尔型:

                    ture,false

    类型是可以转换:

            显示转换:bash不支持

            隐式转换:

    bash是弱类型语言,一切皆字符         

        数字  18  :0001 0010

        字符  18   : 1,8

                    ASCII:128常用字符,计算机最小存储单元字节 8bit

                        1:8bit

                        8:8bit

                        18:16bits


bash的配置文件

        shell中命令行设置的变量,只要退出了当前shell就都会失效,要想变量永久有效,就需要配置bash的相关配置文件。


        配置文件分为两类

        profile类:为交互式登陆的用户提供配置

            全局:(对所有的用户都生效)       

                             

                    /etc/profile

                    /etc/profile.d/*.sh


            某用户:(对某一用户生效)


                    ~/.bash_profile

                                    用户家目录隐藏文件

           功用(一部分):

                1、设定环境变量

                2、运行命令或脚本

         

        bashrc类:非交互式的用户提供配置

            全局:

                    /etc/bashrc

             某用户:

                    ~/.bashrc

        

              功用(部分):

                     1、设定本地变量

                    2、定义命令别名

登陆类型:

        交互式:

                直接通过终端输入账号和密码登陆

                使用su -l USERNAME 或  su - USERNAME:

        非交互式

                su USERNAME

                图形界面下打开的终端

                执行脚本

通过编辑配置文件修改的配置生效

    1、退出并重新登陆

    2、让bash重读此文件

                 .    FILE

                source  FILE

    

   文件读取顺序:(后读取的会覆盖前面的)

          交互登陆的用户

             /etc/profile-->/etc/profile.d/*.sh -->~/.bash_profile --> ~/.bashrc -->/etc/bashrc

          非交互登陆的用户

            ~/.bashrc --> /etc/bashrc --> /etc/profile.d/*.sh 






细节详解


  特殊变量详解

    写一个bash脚本来加强理解:

    建立脚本lab1.sh

    vim lab1.sh

    输入:                                                            

        #!/bin/bash                                          \\echo,是输出到默认标准输出也就是屏幕,#!/bin/bash 是固定格式

        echo "number:$#"                                \\输出 number:$#   看结果输出了  number:5

        echo "sename:$0"                                 \\类同

        echo "first:$1"

        echo "second:$2"

        echo "argume:$@"

        echo "yoyoyo:$*"

     保存退出;赋脚本权限

        执行:

        ./lab1.sh 1 6 3 4 5

        执行结果:

        number:5                                                    \\$#   等于5,也就是我们运行脚本的时候加了5个参数

        sename:./lab1.sh                                        \\$0    我们运行的命令名字是./lab1.sh

        first:1                                                            \\$1   等于1,第一个参数是1

        second:6                                                       \\$2  等于6,第二个参数是6

        argume:1 6 3 4 5                                            \\$@  将所有的参数列出来

        yoyoyo:1 6 3 4 5                                                \\ $*  将所有的参数列出来





bash环境变量:PATH

#echo $PATH

/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin


当执行外部命令的时候,bash会到PATH里这些路径中去找对应的命令文件,去执行。


外部命令查找

bash查找命令的方式

    外部命令查找:$PATH

        第一次执行真正的查找操作:此命令使用行为会缓存

            查看此缓存使用hash命令