都是一些零碎的知識,遇到什麼寫什麼吧!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添加的環境變量是臨時有效,要想永久有效就得添加到文件中:
#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查詢)文件中添加環境變量,對該用戶永久有效。用法跟上面相同。
#!/bin/bash export mytest="Hi"用source Test.sh方式執行,mytest環境變量就能夠添加到當前shell環境中,./Test.sh方式直接執行則不能。