linux bash變量做用域

linux bash變量做用域linux

一,思考一個問題,當在shell裏執行某個程序時,shell是怎麼找到這個程序的?

shell會去$PATH環境變量定義的目錄裏去找這個命令。環境變量裏通常包括/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin這麼多目錄,這些目錄下又有上千個程序,從這麼多目錄裏的,這麼多程序裏查找確定是花費時間的。shell爲了提升查找效率,使用了緩存機制,這個機制叫hashc++

有了hash緩存後,shell先去hash裏查找,若是找到了,就使用;若是沒有找到,纔去$PATH環境變量定義的目錄裏去找,找到後,把命令的路勁加程序名放入hash中。shell

注意:若是是shell的buildin命令,不會放入hash。緩存

  • hash命令用法:bash

    • 查看hash裏都緩存了哪些程序:hash微信

      hits:表明此命令,被命中了幾回。ssh

      # 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 -rui

      # 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

本人微信:xiaoshitou5854

相關文章
相關標籤/搜索