Shell學習筆記

都是一些零碎的知識,遇到什麼寫什麼吧!python

一、shell腳本參數linux

C用(int *argc, char *argv[])處理參數,python sys.argv[0](腳本名字)、sys.argv[1]、sys.argv[2]等表示各個參數,shell腳本本身處理命令參數的方式以下:shell

(1) $# 傳遞到腳本的參數個數,不包括腳本命令自己。如判斷參數是不是2個:ubuntu

 

   #!/bin/bash
   if [ $# != 2 ]; then                                                                                                                   
       echo "Error! should need 2 parameters!"
       exit 1
   fi

 

(2) $0 腳本名字;$1,$2,......依次表示第一個參數,第二個參數,。。。。。。
bash

(3) $* 以一個單字符串顯示全部向腳本傳遞的參數,此選參數可超過9個。如:函數

若腳本參數爲./test.sh arg1 arg2,
則執行echo  $*,
結果爲:"arg1 arg2"

 

 

 

(4) $$ 腳本運行的當前進程ID號。spa

(5) $! 後臺運行的最後一個進程的進程ID號。code

(6) $@  與$*相同,可是使用時加引號,並在引號中返回每一個參數。如:進程

 

若腳本參數爲./test.sh arg1 arg2,
則執行echo  $*,
結果爲:"arg1""arg2"  與#*的差異,每一個參數都是一個單獨的字符串。

 

(7) $-  顯示shell使用的當前選項,與set命令功能相同。(搞不懂)字符串

(8) $?  顯示最後命令的退出狀態。 0表示沒有錯誤,其餘任何值代表有錯誤。如:

 

ls ./
echo $?
$?爲0表示ls命令執行成功。

 

 

二、管道與重定向

管道操做符」|「,輸出左邊命令傳出的正確輸出信息,對與stderr信息沒有直接處理能力。而後,傳遞給右邊的命令,做爲stdin。

要求:

(1) 管道命令只處理前一個命令正確輸出,不處理錯誤輸出;

(2) 管道命令右邊命令,必須可以接收標準輸入流命令才行。如cat test.txt | ls ,ls不支持stdin,左邊的數據將被丟棄。

 

$ cat display.sh | ls
call.py     libtest3.so  libtest.so    send_mail_text.py  test3.cpp  test4.cpp
display.sh  libtest4.so  printfile.sh  test2.cpp          test3.so   test.c

重定向:

 

左邊命令應該有標準輸出  > 或者>>   右邊只能是文件

左邊命令應該有標準輸入  < 或者<<   右邊只能是文件

        管道是觸發了兩個子進程執行"|"兩邊的程序,而重定向是在一個進程內執行。


三、shell與export
首先要知道用戶登陸linux系統以後,系統會啓動一個用戶shell。在該shell下執行shell腳本,會建立一個子shell,子shell能夠共享父shell的環境變量,父shell卻不能共享定義在子shell中的環境變量。子shell中定義的環境變量只在該子shell中有效。

在shell中執行程序時,shell會提供一組環境變量,export可新增、修改和刪除環境變量,供後續執行的程序使用。export設置的變量效用只在該次登陸中有效。

語法:export   [-fnp]   [變量名稱]=[變量設置值]

參數:

-f表明[變量名稱中爲]函數名稱。

-n刪除指定變量,實際上並未刪除,只是不會輸出到後續指令的執行環境中。

-p列出全部shell賦予程序的環境變量,默認參數。
如:

 

Test@ubuntu:~/code$ export   //等同 export -p
declare -x HOME="/home/Test"
declare -x LANG="zh_CN.UTF-8"
declare -x LANGUAGE="zh_CN:en_AU:en_CA:en_GB:en_NZ:en_US:en"
declare -x LC_ADDRESS="zh_CN.UTF-8"
/*中間省略*/
declare -x TERM="linux"
declare -x USER="Test"
declare -x XDG_RUNTIME_DIR="/run/user/1000"
declare -x XDG_SESSION_ID="1"
</pre><pre name="code" class="plain">Test@ubuntu:~/code$ export mytest="Hi"
<pre name="code" class="plain">Test@ubuntu:~/code$ export 
declare -x HOME="/home/Test"
declare -x LANG="zh_CN.UTF-8"
declare -x LANGUAGE="zh_CN:en_AU:en_CA:en_GB:en_NZ:en_US:en"
declare -x LC_ADDRESS="zh_CN.UTF-8"
/*中間省略*/
declare -x TERM="linux"
declare -x USER="Test"
declare -x XDG_RUNTIME_DIR="/run/user/1000"
declare -x XDG_SESSION_ID="1"
declare -x mytest="Hi"
 

 

 
Test@ubuntu:~/code$ export -n mytest
Test@ubuntu:~/code$ export 
declare -x HOME="/home/Test"
declare -x LANG="zh_CN.UTF-8"
declare -x LANGUAGE="zh_CN:en_AU:en_CA:en_GB:en_NZ:en_US:en"
declare -x LC_ADDRESS="zh_CN.UTF-8"
/*中間省略*/
declare -x TERM="linux"
declare -x USER="Test"
declare -x XDG_RUNTIME_DIR="/run/user/1000"
declare -x XDG_SESSION_ID="1"


由於export添加的環境變量是臨時有效,要想永久有效就得添加到文件中:

 

 

(1)在/etc/profile文件中添加變量,對全部用戶永久有效。例如:
#vi    /etc/profile
export CLASSPATH=./JAVA_HOME/lib;$JAVA_HOME/jre/lib
export PATH="$PATH:/home/Test"    //在原PATH變量上添加數據
<span style="font-family: Arial, Helvetica, sans-serif;">注:修改文件後要想立刻生效還要運行source /etc/profile,否則只能在下次重進此用戶時生效。</span>
  (2)在用戶目錄下的.bash_profile(該文件在不一樣的linux系統下,文件名不一樣,有的是.profile,基本以profile結尾,能夠用man bash查詢)文件中添加環境變量,對該用戶永久有效。用法跟上面相同。 
 
關於source,用法爲:source  FileName,做用是在當前bash環境下讀取並執行FileName中的命令,該FileName能夠沒有執行權限。注意該命令中的腳本是在 當前bash環境下執行,沒有產生子shell,因此腳本添加的變量也能被當前shell所共享,跟直接執行腳本產生子shell不太同樣。如一樣的腳本Test.sh:
#!/bin/bash
     export mytest="Hi"
 用source Test.sh方式執行,mytest環境變量就能夠添加到當前shell環境中,./Test.sh方式直接執行則不能。
另外,source命令經常使用「.」來代替。source Test.sh與 .  Test.sh等效。

相關文章
相關標籤/搜索