zoukankan      html  css  js  c++  java
  • 《鸟哥的Linux私房菜》学习笔记(8)——bash脚本编程之变量

    一、变量命名                                                            

        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:
  • 相关阅读:
    RT-Thread can
    scons自动化构建工具
    Android 数据库 SQLiteOpenHelper
    请确保二进制储存在指定的路径中,或者调试他以检查该二进制或相关的DLL文件
    攻防世界misc新手区前三题
    基于session对象实现简单的购物车应用
    MS Excel中的内部日期处理方法
    如何实现对指定日期进行增减日期操作结果的输出
    2020前端大厂最新面试题,这一波我是用“身子换来的”
    字节、拼多多前端面经!
  • 原文地址:https://www.cnblogs.com/mingcaoyouxin/p/4080094.html
Copyright © 2011-2022 走看看