欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  科技

linux bash变量作用域

程序员文章站 2023-09-28 19:45:20
linux bash变量作用域 一,思考一个问题,当在shell里执行某个程序时,shell是怎么找到这个程序的? shell会去$PATH环境变量定义的目录里去找这个命令。环境变量里一般包括 这么多目录,这些目录下又有上千个程序,从这么多目录里的,这么多程序里查找肯定是花费时间的。shell为了提 ......

linux bash变量作用域

一,思考一个问题,当在shell里执行某个程序时,shell是怎么找到这个程序的?

shell会去$path环境变量定义的目录里去找这个命令。环境变量里一般包括/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin这么多目录,这些目录下又有上千个程序,从这么多目录里的,这么多程序里查找肯定是花费时间的。shell为了提高查找效率,使用了缓存机制,这个机制叫hash

有了hash缓存后,shell先去hash里查找,如果找到了,就使用;如果没有找到,才去$path环境变量定义的目录里去找,找到后,把命令的路劲加程序名放入hash中。

注意:如果是shell的buildin命令,不会放入hash。

  • hash命令用法:

    • 查看hash里都缓存了哪些程序:hash

      hits:代表此命令,被命中了几次。

      # hash
      hits    command
         1    /usr/bin/cat
         2    /usr/bin/ls
    • 详细查看hash里都缓存了哪些程序:hash -l

      # hash -l
      builtin hash -p /usr/bin/cat cat
      builtin hash -p /usr/bin/ls ls
    • 清除某个缓存:hash -d cat

      # hash -d cat
      # hash
      hits    command
         2    /usr/bin/ls
    • 清除所有缓存:hash -r

      # hash -r
      # hash
      hash: hash table empty
    • 为什么还要清除缓存?理由:当把命令移动到别的目录后,用原来的缓存就找不到命令了,shell会报出错误,所有要清除。

二,bash变量的作用域

  • shell进程的子孙进程。

    在shell进程里又启动了别的shell进程,下面的例子是在bash里又启动了一个bash,让后在新启动的bash里,又启动了一个csh。

    # pstree
    systemd─┬
            ├─sshd───sshd───bash───pstree
    # bash
    # csh
    # pstree
    systemd─┬
            ├sshd───sshd───bash───bash───csh───pstree
  • bash变量种类:

    • 按变量的作用域范围分为:

    • 本地变量:作用域仅为当前shell进程

      验证本地变量的作用域:

      # firstname=jerry
      # echo $firstname
      jerry
      # csh
      # echo $firstname
      firstname: undefined variable.
      # exit
      exit
      # echo $firstname
      jerry
      • 赋值:name=value

      • 引用:${name},$name

        • "":变量会被替换成其值
        • '':变量不会被替换成其值
      • 查看变量:set

      • 撤销变量:unset name。注意name前不要加$

        # firstname=tom
        # echo $firstname
        tom
        # unset firstname
        # echo $firstname
        
    • 环境变量:作用域为当前shell进程,及其子孙shell进程。

      验证环境变量的作用域:

      # fn=tom
      # echo $fn
      tom
      # export fn
      # csh
      # echo $fn
      tom
      # exit
      exit
      # echo $fn
      tom
      • 赋值:

        • export name=value

        • name=value

          export name

        • declare -x name=value

        • name=value

          declare -x name

      • 引用:同本地变量。

      • 撤销变量:unset name。注意name前不要加$

      • bash内嵌的环境变量:

        path,history,histsize,histfilesize,histcontrol,shell,home,uid,pwd,oldpwd

      • 查看环境变量命令:

        export,declare -x,printenv,env

    • 只读变量(常量):作用域是当前shell进程,且不可以撤销。随当前shell进程的终止而终止。

      • declare -r name
      • readonly name

      检证常量的作用域:

      # la=foo
      # declare -r la
      # echo $la
      foo
      # csh
      # $echo la
      echo: undefined variable.
      # exit
      exit
      # echo $la
      foo
      # la=aa
      -bash: la: readonly variable
      [root@localhost ~]# unset la
      -bash: unset: la: cannot unset: readonly variable
      • 局部变量:函数里的变量,作用域仅为函数内。
    • 位置参数变量:shell脚本的参数

    • 特殊变量:

      • $?:上一个命令的执行结果。0:成功;1-255:失败。
      • ...
  • bash里,多个命令一起执行

    • 多个命令连续执行:command1;command2;command3...

      这些命令都会被执行。

    • 多个命令逻辑连续执行

      根据前面命令的执行结果(成功或者失败),决定是否执行后面的命令。

      • 前一个命令执行成功后,后面的命令才让执行:&&

        例子:先查看目录存不存在,存在了才进入此目录

        # pwd
        /root
        # ls /sdf && cd /tmp
        ls: cannot access /sdf: no such file or directory
        # pwd
        /root
        # ls /sdf || cd /tmp
        ls: cannot access /sdf: no such file or directory
        # pwd
        /tmp
      • 前一个命令执行失败后,后面的命令才让执行:||

        例子:先某个用户存不存在,不存在则创建此用户;存在了就不创建了。

        # pwd
        /root
        # ls /sdf || cd /tmp
        ls: cannot access /sdf: no such file or directory
        # pwd
        /tmp

c/c++ 学习互助qq群:877684253

linux bash变量作用域

本人微信:xiaoshitou5854