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:代表此命令,被命中了几次。

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

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

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

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

二,bash变量的作用域

  • shell进程的子孙进程。

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

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

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

    • ...

    • declare -r name

    • readonly name

    • 局部变量:函数里的变量,作用域仅为函数内。

    • 赋值:

    • 引用:同本地变量。

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

    • bash内嵌的环境变量:

      PATH,HISTORY,HISTSIZE,HISTFILESIZE,HISTCONTROL,SHELL,HOME,UID,PWD,OLDPWD

    • 查看环境变量命令:

      export,declare -x,printenv,env

    • export name=value

    • name=value

      export name

    • declare -x name=value

    • name=value

      declare -x name

    • 赋值:name=value

    • 引用:${name},$name

    • 查看变量:set

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

      # firstname=tom# echo $firstnametom# unset firstname# echo $firstname
    • "":变量会被替换成其值

    • '':变量不会被替换成其值

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

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

      验证本地变量的作用域:

      # firstName=jerry# echo $firstNamejerry# csh# echo $firstNamefirstName: Undefined variable.# exitexit# echo $firstNamejerry
    • 环境变量:作用域为当前shell进程,及其子孙shell进程。

      验证环境变量的作用域:

      # fn=tom# echo $fntom# export fn# csh# echo $fntom# exitexit# echo $fntom
    • 只读变量(常量):作用域是当前shell进程,且不可以撤销。随当前shell进程的终止而终止。

      检证常量的作用域:

      # la=foo# declare -r la# echo $lafoo# csh# $echo laecho: Undefined variable.# exitexit# echo $lafoo# la=aa-bash: la: readonly variable[root@localhost ~]# unset la-bash: unset: la: cannot unset: readonly variable
    • 位置参数变量:shell脚本的参数

    • 特殊变量:

  • bash里,多个命令一起执行

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

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

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

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

      # pwd/root# ls /sdf || cd /tmpls: cannot access /sdf: No such file or directory# pwd/tmp
    • 多个命令连续执行:command1;command2;command3...

      这些命令都会被执行。

    • 多个命令逻辑连续执行

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


三,如何执行shell脚本文件

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

./shell.sh

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

bash shell.sh

  • 练习1

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

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

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

    #!/bin/bashls -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

(0)

相关推荐

  • 找出Linux上使用的shell的最佳方法

    来自:Linux迷    链接:https://www.linuxmi.com Linux和Unix都提供了开箱即用的各种shell.你可以找到bash (Bourne shell), ksh (Ko ...

  • linux系统环境变量一文就够

    Linux是一个多用户的操作系统.每个用户登录系统后,都会有一个专用的运行环境. 通常每个用户默认的环境都是相同的,这个默认环境实际上就是一组环境变量的定义. 环境变量是全局的,设置好的环境变量可以被 ...

  • 一文理解linux环境变量(初学者之友)

    我的戏份在文末,建议结合我们技能树以前出品的一文系列一起学习: linux命令行文本操作一文就够 健明 继续见证学徒的成长! 对于Linux初学者来说,环境变量是个很陌生的名词,很多人不能理解它是到底 ...

  • linux bash中的引号:单双引号、反撇号

    双引号和单引号的区别 反撇号不能用于命令嵌套

  • Python 变量作用域 LEGB (下)

    上篇:Python 变量作用域 LEGB (上)-- Local,Global,Builtin https://www.cnblogs.com/yvivid/p/python_LEGB_1.html ...

  • C语言变量作用域以及栈,堆困惑!!!!

    https://m.toutiao.com/is/Jn8m7wr/ 这几天遇到一段很困惑的代码.用函数内部变量地址做返回值时候,没法正确返回变量a地址,返回的是OX0如下: 我在函数内部再加一个指针q ...

  • linux bash算术运算和条件语句

    +, -, *(乘), /(除), **(乘方), %(取模) let var=算术运算符表达式 高级let用法:let i+=2 +=,-=,*=,/=,%=,**= 自增:let var++ va ...

  • Linux 环境变量配置全攻略

    来自:悠悠i 链接:https://www.cnblogs.com/youyoui/p/10680329.html Linux环境变量配置 在自定义安装软件的时候,经常需要配置环境变量,下面列举出各种 ...

  • Linux 环境变量的所有知识

    今天详细聊聊环境变量吧.这个十分常见而基础的问题,想必经常困扰初学者,属于众多"我问了,人家也答了,我还看了帖子,但始终没搞明白"的问题之一.岛主试试用写科普的啰嗦风格解释一下.今 ...

  • Shell变量有哪些分类?linux运维学习

    shell变量有哪些分类?Shell变量是shell编程学习中重要的内容,每个运维人员都需要掌握.在shell编程中的变量名和等号之间不能有空格.系统中的变量根据作用域及生命周期,可以有哪些分类? s ...