一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

linux bash變量作用域

 悅光陰 2021-01-01


一,思考一個問題,當在shell里執(zhí)行某個程序時,shell是怎么找到這個程序的?

shell會去$PATH環(huán)境變量定義的目錄里去找這個命令。環(huán)境變量里一般包括/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin這么多目錄,這些目錄下又有上千個程序,從這么多目錄里的,這么多程序里查找肯定是花費時間的。shell為了提高查找效率,使用了緩存機制,這個機制叫hash。。

有了hash緩存后,shell先去hash里查找,如果找到了,就使用;如果沒有找到,才去$PATH環(huán)境變量定義的目錄里去找,找到后,把命令的路勁加程序名放入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變量種類:

    • $?:上一個命令的執(zhí)行結(jié)果。0:成功;1-255:失敗。

    • ...

    • declare -r name

    • readonly name

    • 局部變量:函數(shù)里的變量,作用域僅為函數(shù)內(nèi)。

    • 賦值:

    • 引用:同本地變量。

    • 撤銷變量:unset name。注意name前不要加$

    • bash內(nèi)嵌的環(huán)境變量:

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

    • 查看環(huán)境變量命令:

      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 $firstname
      tom
      # unset firstname
      # echo $firstname
    • "":變量會被替換成其值

    • '':變量不會被替換成其值

    • 按變量的作用域范圍分為:

    • 本地變量:作用域僅為當前shell進程

      驗證本地變量的作用域:

      # firstName=jerry
      # echo $firstName
      jerry
      # csh
      # echo $firstName
      firstName: Undefined variable.
      # exit
      exit
      # echo $firstName
      jerry
    • 環(huán)境變量:作用域為當前shell進程,及其子孫shell進程。

      驗證環(huán)境變量的作用域:

      # fn=tom
      # echo $fn
      tom
      # export fn
      # csh
      # echo $fn
      tom
      # exit
      exit
      # echo $fn
      tom
    • 只讀變量(常量):作用域是當前shell進程,且不可以撤銷。隨當前shell進程的終止而終止。

      檢證常量的作用域:

      # 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
    • 位置參數(shù)變量:shell腳本的參數(shù)

    • 特殊變量:

  • bash里,多個命令一起執(zhí)行

    • 前一個命令執(zhí)行成功后,后面的命令才讓執(zhí)行:&&

      例子:先查看目錄存不存在,存在了才進入此目錄

      # 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
    • 前一個命令執(zhí)行失敗后,后面的命令才讓執(zhí)行:||

      例子:先某個用戶存不存在,不存在則創(chuàng)建此用戶;存在了就不創(chuàng)建了。

      # pwd
      /root
      # ls /sdf || cd /tmp
      ls: cannot access /sdf: No such file or directory
      # pwd
      /tmp
    • 多個命令連續(xù)執(zhí)行:command1;command2;command3...

      這些命令都會被執(zhí)行。

    • 多個命令邏輯連續(xù)執(zhí)行

      根據(jù)前面命令的執(zhí)行結(jié)果(成功或者失?。?,決定是否執(zhí)行后面的命令。


三,如何執(zhí)行shell腳本文件

1,用chmod賦予shell文件可執(zhí)行權(quán)限。

./shell.sh

2,把shell文件(這個文件不需要有執(zhí)行權(quán)限)作為參數(shù),傳給bash程序。

bash shell.sh

  • 練習1

    1,顯示/etc目錄下所有以p(不區(qū)分大小寫)開頭的文件或者目錄本身。

    2,顯示/var目錄下的所有文件或目錄,并將顯示結(jié)果中的小寫字母轉(zhuǎn)換為大寫后顯示

    3,創(chuàng)建臨時文件/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進程

    • 執(zhí)行shell腳本文件時,啟動的shell進程

2,bash配置文件的種類

  • profile類

    • 用于定義環(huán)境變量

    • 運行命令或腳本

    • /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

    本站是提供個人知識管理的網(wǎng)絡存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多

    好吊视频一区二区在线| 又黄又色又爽又免费的视频| 中文字幕一区久久综合| 蜜臀人妻一区二区三区| 成人亚洲国产精品一区不卡 | 日本欧美三级中文字幕| 一区二区三区免费公开| 国产一级特黄在线观看| 日韩欧美国产精品自拍| 成人三级视频在线观看不卡| 黑人巨大精品欧美一区二区区 | 亚洲av熟女国产一区二区三区站| 国产又粗又猛又爽又黄| 国产成人一区二区三区久久| 成在线人免费视频一区二区| 大香蕉久久精品一区二区字幕| 韩国激情野战视频在线播放| 好吊一区二区三区在线看| 欧美成人精品国产成人综合| 国产专区亚洲专区久久| 美女被草的视频在线观看| 中文字幕在线五月婷婷| 国产亚洲午夜高清国产拍精品| 色哟哟哟在线观看视频| 中文字幕亚洲精品乱码加勒比| 这里只有九九热精品视频| 精品国自产拍天天青青草原| 人妻久久这里只有精品| 欧美中文日韩一区久久| 视频一区日韩经典中文字幕| 国产精品国三级国产专不卡| 国产对白老熟女正在播放| 色婷婷视频免费在线观看| 成人精品欧美一级乱黄| 五月婷婷六月丁香狠狠| 国产情侣激情在线对白| 国产精品香蕉免费手机视频| 亚洲国产精品一区二区毛片| 日本一区不卡在线观看| 九九热这里只有免费精品| 人妻熟女欲求不满一区二区|