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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM