都是一些零碎的知識,遇到什麼寫什麼吧!
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添加的環境變量是臨時有效,要想永久有效就得添加到文件中:
#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方式直接執行則不能。: