zoukankan      html  css  js  c++  java
  • Linux基础之Shell与变量

    一、提出问题

    在平时的工作中,我们经常会碰到设置环境的问题,例如将应用的执行路径添加到PATH中,方便程序的执行;在Linux中更多的时候是跟shell打交道,很多通过shell启动的应用或者服务都需要设置环境变量,例如启动es需要设置一些环境变量,那么Shell到底是什么?Shell又跟环境变量有什么关系?

    二、什么是Shell

    我们知道计算机的CPU只能执行二进制表示的机器语言,在计算的早期,只有极少数的人才可以使用二进制语言来操纵计算机,这对我们所有人来说都是很难阅读和编写的,极大的提高了计算机的使用门槛。后来发展出来了操作系统,并在操作系统中提供了一个称为Shell的特殊程序,Shell接收用户输入的的英语指令,并将它将传递给操作系统的内核进行执行。从开发语言的角度上来说,shell脚本是一种面向计算机用户的脚本语言,而Shell程序就是这种脚本语言的解释器。Shell不是系统内核的一部分,但是使用系统内核执行程序,创建文件等。
    shell、普通应用程序及操作系统内核的关系如下图

    三、什么是变量

    跟其他的高级开发语言一样,Shell里边的数据也需要保存在变量中。像任何程序一样,Shell使用变量来控制其行为,并且可以通过更改其值来更改Shell和其他程序的行为。
    同样变量也有自己的命名规则

    • 变量名称区分大小写。按照约定,环境变量应具有大写名称。
    • 当给变量赋多个值时,它们必须用冒号分隔:。
    • 等号周围没有空格=。
      变量可以分为两大类,环境变量和外壳变量。
      环境变量是在整个系统范围内可用的变量,并由所有衍生的子进程和外壳程序继承。
      Shell变量是仅适用于当前Shell实例的变量。

    四、变量的各种操作

    1. 查看环境变量

    使用printenv来查看环境变量的值,如果不写变量名字,则显示出所有的环境变量

    mango@mango:~$ printenv HOME
    /home/mango
    mango@mango:~$ printenv
    SHELL=/bin/bash
    SESSION_MANAGER=local/mango:@/tmp/.ICE-unix/1441,unix/mango:/tmp/.ICE-unix/1441
    QT_ACCESSIBILITY=1
    COLORTERM=truecolor
    XDG_CONFIG_DIRS=/etc/xdg/xdg-ubuntu:/etc/xdg
    XDG_MENU_PREFIX=gnome-
    GNOME_DESKTOP_SESSION_ID=this-is-deprecated
    GTK_IM_MODULE=fcitx
    LANGUAGE=en_US:en
    QT4_IM_MODULE=fcitx
    LC_ADDRESS=zh_CN.UTF-8
    GNOME_SHELL_SESSION_MODE=ubuntu
    LC_NAME=zh_CN.UTF-8
    SSH_AUTH_SOCK=/run/user/1000/keyring/ssh
    XMODIFIERS=@im=fcitx
    DESKTOP_SESSION=ubuntu
    

    可以同时打印多个变量

    mango@mango:~$ printenv USER  PWD
    mango
    /home/mango
    

    也可以使用echo打印变量的值,但是需要在变量前边加上$

    mango@mango:~$ echo $USER
    mango
    mango@mango:~$ echo $USER $PWD
    mango /home/mango
    
    1. 搜索特定变量

    可以使用grep命令查找包含某个字符串的所有变量

    mango@mango:~$ printenv | grep USER
    USERNAME=mango
    USER=mango
    

    还有一个set命令,除了可以打印环境变量,同时也包括Shell变量和Shell函数

    mango@mango:~$ set | grep USER
    USER=mango
    USERNAME=mango
        local -a dirs=(${BASH_COMPLETION_USER_DIR:-${XDG_DATA_HOME:-$HOME/.local/share}/bash-completion}/completions);
    
    1. 定义变量

    使用命令行设置变量的最简单方法是键入其名称并直接赋值

    mango@mango:~$ shellVar=hello
    mango@mango:~$ echo $shellVar
    hello
    

    这样定义的是Shell变量,可以使用set查看,但是无法使用printenv查看

    mango@mango:~$ printenv shellVar
    mango@mango:~$ set | grep shellVar
    shellVar=hello
    
    

    启动子shell无法打印变量的值

    mango@mango:~$ echo $shellVal
    hello
    mango@mango:~$ bash
    mango@mango:~$ echo $shellVal
    
    mango@mango:~$ 
    
    
    1. 导出Shell变量

    我们可以使用export来导出Shell变量,将其提升为环境变量,这是就可以使用printenv及在子shell里打印

    mango@mango:~$ export shellVal
    mango@mango:~$ printenv shellVal
    hello
    mango@mango:~$ bash
    mango@mango:~$ printenv shellVal
    hello
    
    
    1. 固化环境变量

    直接使用export导出的环境变量,只是保存在当前回话的内存中,所以关闭Shell后就会丢失;我们需要将环境变量添加到配置文件中。
    如果只为当前用户设置,需要编辑.bashrc文件

    sudo nano ~/.bashrc
    

    在文件末尾添加下边的语句

    export shellVal=hello
    

    保存并退出,重新启动外壳程序后,将应用更改。如果要在当前会话应用更改,需要使用source命令

    source ~/.bashrc
    

    如果要为所有用户设置环境变量,需要在/etc/profile.d文件夹中创建一个变量文件

    mango@mango:~$ sudo touch /etc/profile.d/mango_env.sh
    mango@mango:~$ sudo chmod +x /etc/profile.d/mango_env.sh
    mango@mango:~$ sudo nano /etc/profile.d/mango_env.sh
    

    在文件末尾添加下边的语句

    export shellVal=hello
    

    保存并退出,重新启动外壳程序后,将应用更改。如果要在当前会话应用更改,需要使用source命令

    source /etc/profile.d/mango_env.sh
    
  • 相关阅读:
    计算panel的靶向区段长度
    interval的排序,合并,取样等功能
    Bait 和 target的区别
    R 数据拆分到列
    制作annovar注释依赖的cosmic数据库
    制作适用于annovar的COSMIC数据库
    痘痘机理
    属性、域、元组、关系、候选码、主键、外键、关系代数
    how to install emacs25 in ubuntu 14
    Centos Install Emacs
  • 原文地址:https://www.cnblogs.com/wufengtinghai/p/14604516.html
Copyright © 2011-2022 走看看