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

三,如何执行shell脚本文件

1,用chmod赋予shell文件可执行权限。

./shell.sh

2,把shell文件(这个文件不需要有执行权限)作为参数,传给bash程序。

bash shell.sh

  • 练习1

    1,显示/etc目录下所有以p(不区分大小写)开头的文件或者目录本身。

    2,显示/var目录下的所有文件或目录,并将显示结果中的小写字母转换为大写后显示

    3,创建临时文件/tmp/myfile.XXXX

    #!/bin/bash
    ls -ld /etc/p*
    ls -d /var/* | tr 'a-z' 'A-Z'
    mktemp /tmp/myfile.XXXX

四,bash配置文件

1,启动shell进程的种类:

  • 交互方式启动的shell进程

    • 直接通过终端输入账号密码后登录后,启动的shell进程
    • 使用su命令:su - username,或者使用su-l username,登录后,启动的shell进程
  • 非交互方式启动的shell进程
    • 使用su命令:su username,登录后,启动的shell进程
    • 在gnome或者kde下打开终端后,启动的shell进程
    • 执行shell脚本文件时,启动的shell进程

2,bash配置文件的种类

  • profile类

    • 对所有用户都有效,只有管理员才可以修改下面的配置文件

      • /etc/profile
      • /etc/profile.d/*.sh
    • 仅对当前用户有效

      ~/.bash_profile

    • 功用:

      • 用于定义环境变量
      • 运行命令或脚本
  • bashrc类

    • 对所有用户都有效,只有管理员才可以修改下面的配置文件

      /etc/bashrc

    • 仅对当前用户有效

      ~/.bashrc

    • 功用:

      • 定义本地变量
      • 定义命令别名

3,bash配置文件的加载顺序。

  • 交互方式启动的shell进程

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

  • 非交互方式启动的shell进程

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

4,重新加载配置文件

  • 当修改配置文件后,是不会立即生效的
  • 使用source 配置名,让修改的配置立即生效

五,用emacs编写shell脚本

1,自动补全的快捷键:ESC TAB

# c/c++ 学习互助QQ群:877684253
![](https://img2018.cnblogs.com/blog/1414315/201811/1414315-20181106214320230-961379709.jpg)
# 本人微信:xiaoshitou5854

linux bash变量作用域的更多相关文章

  1. linux bash变量替换(# ## % %% / //)

    VAR=hahaha echo ${VAR#*h} # ahaha 从前向后匹配删除 VAR=hahaha echo ${VAR##*h} # a 贪婪模式,从前向后匹配删除所有 VAR=hahaha ...

  2. 在Linux系详解Linux bash中的变量

    (大讲台:国内首个it在线教育混合式自适应学习) 统中进行日常运维或者是编写脚本时,变量是再熟悉不过的了,但这些变量都有哪些类型,具体的用法又有哪些差异呢?本文整理分享给大家: 一.bash变量类型: ...

  3. linux shell自定义函数(定义、返回值、变量作用域)介绍

    http://www.jb51.net/article/33899.htm linux shell自定义函数(定义.返回值.变量作用域)介绍 linux shell 可以用户定义函数,然后在shell ...

  4. 【Linux】linux bash shell之变量替换::=句法、=句法、:-句法、-句法、=?句法、?句法、:+句法、+句法

    linux bash shell之变量替换::=句法.=句法.:-句法.-句法.=?句法.?句法.:+句法.+句法   linux bash shell之变量替换::=句法.=句法.:-句法.-句法. ...

  5. linux学习18 shell脚本基础-bash变量和逻辑运行

    一.回顾 1.用户管理,权限管理,install,mktemp 2.用户管理: 3.权限管理: mode,ownership mode: user group other r w x 4.命令:ins ...

  6. [转帖]linux bash环境变量简单总结

    linux bash环境变量简单总结 来源链接:http://www.178linux.com/8005 原创文章,如有转载,请注明原文地址 需要简单学习一下. 其实 我都是直接放一个 .sh文件到 ...

  7. Linux环境变量和本地变量

    每一种编程语言中,我们都会碰到变量的作用域的问题.(比如在函数中定义的变量在函数外不能使用的) BASH 中也有类似的问题,局部变量和环境变量(全局变量). 局部变量是普通的变量,仅在创建它的Shel ...

  8. Linux学习笔记之Linux环境变量总结

    0x00 概述 Linux是一个多用户多任务的操作系统,可以在Linux中为不同的用户设置不同的运行环境,具体做法是设置不同用户的环境变量. 0x01 Linux环境变量分类 按照生命周期来分,Lin ...

  9. Linux环境变量总结 转

    转自https://www.jianshu.com/p/ac2bc0ad3d74 Linux是一个多用户多任务的操作系统,可以在Linux中为不同的用户设置不同的运行环境,具体做法是设置不同用户的环境 ...

随机推荐

  1. nginx实现内网服务唯一端口外网映射

    2.1         内网服务唯一端口外网映射 (一)       组网图 (二)       简要说明: 如标题所示,该功能可以实现内网环境下所有服务端口通过nginx的正向代理通过唯一端口映射至 ...

  2. 从spring boot发邮件聊到开发的友好性

    前些天帮一个朋友做网站,全站都是静态页面,唯一需要用到后端开发的是他需要一个留言板.传统的留言板一般都是提交后保存到数据库,然后提供一个后台的留言列表给管理人员看,我嫌麻烦,就决定留言提交到后台直接发 ...

  3. Spring MVC上传文件原理和resolveLazily说明

    问题:使用Spring MVC上传大文件,发现从页面提交,到进入后台controller,时间很长.怀疑是文件上传完成后,才进入.由于在HTTP首部自定义了“Token”字段用于权限校验,Token的 ...

  4. luogu P1972 [SDOI2009]HH的项链 |树状数组 或 莫队

    题目描述 HH 有一串由各种漂亮的贝壳组成的项链.HH 相信不同的贝壳会带来好运,所以每次散步完后,他都会随意取出一段贝壳,思考它们所表达的含义.HH 不断地收集新的贝壳,因此,他的项链变得越来越长. ...

  5. react-native布局中的层级问题(zIndex,elevation)

    目录 关于层级的zIndex/elevation 1.zIndex是rn在0.30开始支持的属性,是可以生效的: 2.shadow和elevation 结论 关于层级的zIndex/elevation ...

  6. bug小结

    在不同的文件下面可以创建同一个包,但是不能创建同一个class文件!!!   ParameterType:需要写实体类的类型,最好不要写实体的别名 这是因为我们在配置mybatis的配置文件时已经说明 ...

  7. 数据库Oracle的安装与卸载

    Oracle的安装步骤: 口令管理里面有scott,需要重新设置其口令,scott是测试表,里面有现成的表可以用来做实验. Oracle  自带客户端工具 SQLPlus sys 用户登录命令: sy ...

  8. HTML5学习第二天!

    学习了一天,然后整理内容到现在,感觉昨天的学习效率有点差,哎! 感受尽在代码中,布局真的脑壳疼,仅仅只整理了CSS中的list: <!DOCTYPE html> <html> ...

  9. Redis 命令执行过程(下)

    在上一篇文章中<Redis 命令执行过程(上)>中,我们首先了解 Redis 命令执行的整体流程,然后细致分析了从 Redis 启动到建立 socket 连接,再到读取 socket 数据 ...

  10. Java中的try-catch-finally异常处理

    Java中的try-catch-finally异常处理 一.异常处理 异常(Exception):是在运行发生的不正常情况. 原始异常处理: if(条件) { 处理办法1 处理办法2 处理办法3 } ...