Shell學習筆記

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

1、shell腳本參數

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

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

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

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

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

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


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

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

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

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

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

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

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

2、管道與重定向

管道操作符”|“,輸出左邊命令傳出的正確輸出信息,對與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
重定向:

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

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

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


3、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等效。






發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章