《鸟哥的Linux私房菜》学习笔记(8)——bash脚

系统 1896 0

一、变量命名                                                            

    1、只能包含字母、数字和下划线,并且不能以数字开头,
    2、不应该跟系统中已有的环境变量重名
    3、命名要有含义

二、变量赋值                                                           

变量名称=值var_name=value 等号两边不能有空格

      
        
          [root@hao ~]#
        
      
       NAME=
      
        jerry


        
          
            [root@hao 
          
        
      
      
        
          ~]#
        
      
      
        echo
      
      
         $NAME

jerry
      
    

三、bash:变量类型                                                                                

1、环境变量

  脚本在执行时会启动一个子shell进程。命令行中启动的脚本会继承当前shell环境变量,也就是说环境变量的作用域为当前shell进程及其子shell进程。系统自动执行的脚本(非命令行启动)则需要自我定义各环境变量。可以使用export设置环境变量。

      export VARNAME=VALUE 或者 VARNAME=VALUE export VARNAME
    

 

      
        
          [root@hao ~]#
        
      
       NAME=
      
        jerry


        
          
            [root@hao 
          
        
      
      
        
          ~
        
      
      
        
          
            ]#
          
        
        export NAME


        
          
            [root@hao 
          
        
      
      
        
          ~]#
        
      
      
        echo
      
      
         $NAME

jerry


        
          
            [root@hao 
          
        
      
      
        
          ~
        
      
      
        
          
            ]#
          
        
         bash


        
          
            [root@hao 
          
        
      
      
        
          ~]#
        
      
      
        echo
      
      
         $NAME

jerry


        
          
            [root@hao 
          
        
      
      
        
          ~
        
      
      
        
          
            ]#
          
        
        bash                     

[root@hao 
      
      ~]# 
      
        echo
      
      
         $NAME

jerry
        
[root@hao ~]# pstree
init-+-NetworkManager-+-dhclient
    ...
     |-sshd---sshd---sshd---bash--- su---bash---bash---bash---pstree
     |-udevd---2*[udevd]
     `-wpa_supplican

2、本地变量(局部变量)

变量一定是进程的变量,因此在一个shell中声明的变量在其他的shell中不可用,并且在其子shell中也不可以得到。引用变量要加${varname},也可以不加{}。

      
        
          [root@hao ~]#
        
      
      NAME=
      
        jerry


        
          
            [root@hao 
          
        
      
      
        
          ~]#
        
      
      
        echo
      
      
         $NAME

jerry


        
          
            [root@hao 
          
        
      
      
        
          ~
        
      
      
        
          
            ]#
          
        
         bash


        
          
            [root@hao 
          
        
      
      
        
          ~]#
        
      
      
        echo
      
      
         $NAME




        
          
            [root@hao 
          
        
      
      
        
          ~
        
      
      
        
          
            ]#
          
        
         exit

exit


        
          
            [root@hao 
          
        
      
      
        
          ~]#
        
      
      
        echo
      
      
         $NAME

jerry
      
    

本地变量:VARNAME=VALUE,作用域:整个bash进程。

局部变量 :local VARNAME=VALUE,作用域:当前代码段。

3、位置变量

 $n

例:写一个脚本,能接受一个参数(文件路径),判定此参数是否是一个存在的文件,如果是就显示“ok”

      
        
          [root@hao ~]#
        
      
       nano filetest.
      
        sh
      
      
        
           [root@hao ~]#
        
      
      
        cat
      
       filetest.
      
        sh
      
      
         

#
      
      ! /bin/
      
        bash

#


      
      
        if
      
       [ -e $
      
        1
      
       ];
      
        then
      
      
        echo
      
      
        "
      
      
        ok
      
      
        "
      
      
        else
      
      
        echo
      
      
        "
      
      
        no such file
      
      
        "
      
      
        fi
      
      
        
           [root@hao ~]#
        
      
      
        chmod
      
       +x filetest.
      
        sh
      
      
        
           [root@hao ~]#
        
      
       ./filetest.
      
        sh
      
        /etc/
      
        fstab

ok


        
          
            [root@hao 
          
        
      
      
        
          ~]#
        
      
       ./filetest.
      
        sh
      
        /etc/
      
        fstabs

no such 
      
      
        file
      
    

shift, 每次shift都会剔除一个参数 shift n表示剔除n 个

      
        
          [root@hao ~]#
        
      
       nano filetest1.
      
        sh
      
      
        
           [root@hao ~]#
        
      
      
        cat
      
       filetest1.
      
        sh
      
      
        

#
      
      !/bin/
      
        bash


      
      
        echo
      
       $
      
        1
      
      
        shift
      
      
        echo
      
       $
      
        1
      
      
        shift
      
      
        echo
      
       $
      
        1
      
      
        
           [root@hao
        
         ~]#
      
      
        chmod
      
       +x filetest1.
      
        sh
      
      
        
           [root@hao ~]#
        
      
      ./filetest1.
      
        sh
      
      
        1
      
      
        2
      
      
        3
      
      
        1
      
      
        2
      
      
        3
      
      
        
          
            
            
          
        
      
    

4、特殊变量(系统变量)

用来保存某些特殊数据:

  $?: 保存上一个命令的执行状态返回值(0-255)。0为正确,其他为错误。其中1,2,127系统预留,其他的可以自定义。

      
        
          [root@hao ~]#
        
      
      
        ls
      
       /
      
        var

account  crash  db     games  lib    lock  mail  opt       run    tmp  yp

cache    cvs    empty  gdm    local  log   nis   preserve  spool  www


        
          
            [root@hao 
          
        
      
      
        
          ~]#
        
      
      
        echo
      
       $?


      
        0
      
      
        
           [root@hao ~]#
        
      
      
        ls
      
       /
      
        varr


      
      
        ls
      
      : cannot access /varr: No such 
      
        file
      
      
         or directory


        
          
            [root@hao 
          
        
      
      
        
          ~]#
        
      
      
        echo
      
       $?


      
        2
      
    

如果只想看返回的状态值而不想看输出结果,则只需将输出重定向至数据黑洞/dev/null

      
        
          [root@hao ~]#
        
      
      
        ls
      
       /varr &> /dev/
      
        null
      
      
        
           [root@hao ~]#
        
      
      
        echo
      
       $?


      
        2
      
    

  $#:参数的个数

  $*:参数列表

  $@:参数列表(与上面的有不同)

例:写一个脚本,能接受一个参数(文件路径),判定此参数是否是一个存在的文件,如果是就显示“ok”

      
        
          [root@hao ~]#
        
      
       nano filetest.
      
        sh
      
      
        
           [root@hao
        
      
      ~]# 
      
        cat
      
       filetest.
      
        sh
      
      
         

#
      
      ! /bin/
      
        bash

#


      
      
        echo
      
      
         $#


      
      
        echo
      
       $*


      
        echo
      
      
         $@


      
      
        if
      
       [ $# -lt 
      
        1
      
       ];
      
        then
      
      
        echo
      
      
        "
      
      
        Usage:./filetest.sh ARG1 ARG2 ...
      
      
        "
      
      
        

    exit 
      
      
        7
      
      
        fi
      
      
        if
      
       [ -e $
      
        1
      
       ];
      
        then
      
      
        echo
      
      
        "
      
      
        ok
      
      
        "
      
      
        else
      
      
        echo
      
      
        "
      
      
        no such file
      
      
        "
      
      
        fi
      
      
        
           [root@hao ~]#
        
      
      
        chmod
      
       +x filetest.
      
        sh
      
      
        
           [root@hao ~]#
        
      
       ./filetest.
      
        sh
      
      
        0
      
      
        





Usage:.
      
      /filetest.
      
        sh
      
       ARG1 ARG2 ...
      
[root@hao ~]# ./filetest.sh  /etc/fstab /etc/fstabs
2
/etc/fstab /etc/fstabs
/etc/fstab /etc/fstabs
ok

四、撤销变量                                                              

      
        
          [root@hao ~
        
      
      
        
          
            ]#
          
        
        unset NAME


        
          
            [root@hao 
          
        
      
      
        
          ~]#
        
      
      
        echo
      
       $NAME
      

五、查看当前shell变量                                                查看当前shell所有变量,包含环境变量和本地变量

      
        
          [root@hao ~
        
      
      
        
          
            ]#
          
        
        set

BASH
      
      =/bin/
      
        bash

BASHOPTS
      
      =
      
        checkwinsize:cmdhist:expand_aliases:extquote:force_fignore:hostcomplete:interactive_comments:login_shell:progcomp:promptvars:sourcepath

BASH_ALIASES
      
      =
      
        ()

...
      
    

查看当前shell环境变量 printenv env 或者export

      
        
          [root@hao ~
        
      
      
        
          
            ]#
          
        
        printenv

HOSTNAME
      
      =
      
        hao

SHELL
      
      =/bin/
      
        bash

TERM
      
      =
      
        xterm

...
      
    

六、追加shell变量                                                      

      
        
          [root@hao ~]#
        
      
      ANIMAL=
      
        pig


        
          
            [root@hao 
          
        
      
      
        
          ~]#
        
      
      ANIMAL=
      
        $ANIMAL:goat


        
          
            [root@hao 
          
        
      
      
        
          ~]#
        
      
      
        echo
      
      
         $ANIMAL

pig:goat


        
          
            [root@hao 
          
        
      
      
        
          ~]#
        
      
      
        echo
      
      
         $PATH


      
      /usr/lib64/qt-
      
        3.3
      
      /bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/
      
        bin


        
          
            [root@hao 
          
        
      
      
        
          ~]#
        
      
      export PATH=$PATH:/usr/local/apache/
      
        bin


        
          
            [root@hao 
          
        
      
      
        
          ~]# 
        
      
      
        echo
      
      
         $PATH


      
      /usr/lib64/qt-
      
        3.3
      
      /bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin:/usr/local/apache/
      
        bin


        
          
            [root@hao 
          
        
      
      
        
          ~]#
        
      
       export PATH=/usr/local/mysql/
      
        bin:$PATH


        
          
            [root@hao 
          
        
      
      
        
          ~]#
        
      
      
        echo
      
      
         $PATH


      
      /usr/local/mysql/bin:/usr/lib64/qt-
      
        3.3
      
      /bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin:/usr/local/apache/bin
    

七、第一个脚本程序                                                     

首先创建脚本程序first.sh,脚本程序的第一行要指定程序的魔数,#!加上解释器的路径。然后赋予其执行权限,之后执行,执行时候要加上路径,因为在没有给路径时,默认去path中去找该命令是否存在。

      
        
          [root@hao ~]#
        
      
      
        cat
      
       first.
      
        sh
      
      
        

#
      
      !/bin/
      
        bash


      
      
        ls
      
       /
      
        var


      
      
        cat
      
       /etc/
      
        inittab


        
          
            [root@hao 
          
        
      
      
        
          ~]#
        
      
      
        chmod
      
       +x first.
      
        sh
      
      
        
           [root@hao ~]#
        
      
      ./first.
      
        sh
      
      
        

account  crash    db     games  lib    lock  mail  opt       run      tmp  yp

cache     cvs    empty  gdm    local  log   nis     preserve  spool  www

# inittab is only used by upstart 
      
      
        for
      
      
         the default runlevel.

#

# ADDING OTHER CONFIGURATION HERE WILL HAVE NO EFFECT ON YOUR SYSTEM.

#

# System initialization is started by 
      
      /etc/init/
      
        rcS.conf

#

# Individual runlevels are started by 
      
      /etc/init/
      
        rc.conf

#

# Ctrl
      
      -Alt-Delete is handled by /etc/init/control-alt-
      
        delete.conf

#

# Terminal gettys are handled by 
      
      /etc/init/tty.conf and /etc/init/
      
        serial.conf,

# with configuration 
      
      
        in
      
       /etc/sysconfig/
      
        init.

#

# For information on how to 
      
      
        write
      
      
         upstart event handlers, or how

# upstart works, see init(
      
      
        5
      
      ), init(
      
        8
      
      ), and initctl(
      
        8
      
      
        ).

#

# Default runlevel. The runlevels used are:

#   
      
      
        0
      
       -
      
         halt (Do NOT set initdefault to this)

#   
      
      
        1
      
       -
      
         Single user mode

#   
      
      
        2
      
       - Multiuser, without NFS (The same as 
      
        3
      
      , 
      
        if
      
       you 
      
        do
      
      
         not have networking)

#   
      
      
        3
      
       -
      
         Full multiuser mode

#   
      
      
        4
      
       -
      
         unused

#   
      
      
        5
      
       -
      
         X11

#   
      
      
        6
      
       -
      
         reboot (Do NOT set initdefault to this)

# 


      
      
        id
      
      :
      
        5
      
      :initdefault:
    

《鸟哥的Linux私房菜》学习笔记(8)——bash脚本编程之变量


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论