1. 程式人生 > >Linux基礎之Shell與變數

Linux基礎之Shell與變數

一、提出問題 在平時的工作中,我們經常會碰到設定環境的問題,例如將應用的執行路徑新增到PATH中,方便程式的執行;在Linux中更多的時候是跟shell打交道,很多通過shell啟動的應用或者服務都需要設定環境變數,例如啟動es需要設定一些環境變數,那麼Shell到底是什麼?Shell又跟環境變數有什麼關係? 二、什麼是Shell 我們知道計算機的CPU只能執行二進位制表示的機器語言,在計算的早期,只有極少數的人才可以使用二進位制語言來操縱計算機,這對我們所有人來說都是很難閱讀和編寫的,極大的提高了計算機的使用門檻。後來發展出來了作業系統,並在作業系統中提供了一個稱為Shell的特殊程式,Shell接收使用者輸入的的英語指令,並將它將傳遞給作業系統的核心進行執行。從開發語言的角度上來說,shell指令碼是一種面向計算機使用者的指令碼語言,而Shell程式就是這種指令碼語言的直譯器。Shell不是系統核心的一部分,但是使用系統核心執行程式,建立檔案等。 shell、普通應用程式及作業系統核心的關係如下圖 ![](https://img2020.cnblogs.com/blog/55173/202104/55173-20210401001732982-1639541455.gif) 三、什麼是變數 跟其他的高階開發語言一樣,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 ``` 2. 搜尋特定變數 可以使用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); ``` 3. 定義變數 使用命令列設定變數的最簡單方法是鍵入其名稱並直接賦值 ``` 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:~$ ``` 4. 匯出Shell變數 我們可以使用export來匯出Shell變數,將其提升為環境變數,這是就可以使用printenv及在子shell裡列印 ``` mango@mango:~$ export shellVal mango@mango:~$ printenv shellVal hello mango@mango:~$ bash mango@mango:~$ printenv shellVal hello ``` 5. 固化環境變數 直接使用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