都是一些零碎的知識(shí),遇到什么寫什么吧!
1、shell腳本參數(shù)
C用(int *argc, char *argv[])處理參數(shù),python sys.argv[0](腳本名字)、sys.argv[1]、sys.argv[2]等表示各個(gè)參數(shù),shell腳本自己處理命令參數(shù)的方式如下:
(1) $# 傳遞到腳本的參數(shù)個(gè)數(shù),不包括腳本命令本身。如判斷參數(shù)是否是2個(gè):
#!/bin/bash if [ $# != 2 ]; then echo "Error! should need 2 parameters!" exit 1 fi
(2) $0 腳本名字;$1,$2,......依次表示第一個(gè)參數(shù),第二個(gè)參數(shù),。。。。。。
(3) $* 以一個(gè)單字符串顯示所有向腳本傳遞的參數(shù),此選參數(shù)可超過(guò)9個(gè)。如:
若腳本參數(shù)為./test.sh arg1 arg2,則執(zhí)行echo $*,結(jié)果為:"arg1 arg2"
(4) $$ 腳本運(yùn)行的當(dāng)前進(jìn)程ID號(hào)。
(5) $! 后臺(tái)運(yùn)行的最后一個(gè)進(jìn)程的進(jìn)程ID號(hào)。
(6) $@ 與$*相同,但是使用時(shí)加引號(hào),并在引號(hào)中返回每個(gè)參數(shù)。如:
若腳本參數(shù)為./test.sh arg1 arg2,則執(zhí)行echo $*,結(jié)果為:"arg1""arg2" 與#*的差別,每個(gè)參數(shù)都是一個(gè)單獨(dú)的字符串。
(7) $- 顯示shell使用的當(dāng)前選項(xiàng),與set命令功能相同。(搞不懂)
(8) $? 顯示最后命令的退出狀態(tài)。 0表示沒(méi)有錯(cuò)誤,其他任何值表明有錯(cuò)誤。如:
ls ./echo $?$?為0表示ls命令執(zhí)行成功。
2、管道與重定向
管道操作符”|“,輸出左邊命令傳出的正確輸出信息,對(duì)與stderr信息沒(méi)有直接處理能力。然后,傳遞給右邊的命令,作為stdin。
要求:
(1) 管道命令只處理前一個(gè)命令正確輸出,不處理錯(cuò)誤輸出;
(2) 管道命令右邊命令,必須能夠接收標(biāo)準(zhǔn)輸入流命令才行。如cat test.txt | ls ,ls不支持stdin,左邊的數(shù)據(jù)將被丟棄。
$ cat display.sh | lscall.py libtest3.so libtest.so send_mail_text.py test3.cpp test4.cppdisplay.sh libtest4.so PRintfile.sh test2.cpp test3.so test.c
重定向:
左邊命令應(yīng)該有標(biāo)準(zhǔn)輸出 > 或者>> 右邊只能是文件
左邊命令應(yīng)該有標(biāo)準(zhǔn)輸入 < 或者<< 右邊只能是文件
管道是觸發(fā)了兩個(gè)子進(jìn)程執(zhí)行"|"兩邊的程序,而重定向是在一個(gè)進(jìn)程內(nèi)執(zhí)行。
3、shell與export首先要知道用戶登錄linux系統(tǒng)之后,系統(tǒng)會(huì)啟動(dòng)一個(gè)用戶shell。在該shell下執(zhí)行shell腳本,會(huì)創(chuàng)建一個(gè)子shell,子shell可以共享父shell的環(huán)境變量,父shell卻不能共享定義在子shell中的環(huán)境變量。子shell中定義的環(huán)境變量只在該子shell中有效。
在shell中執(zhí)行程序時(shí),shell會(huì)提供一組環(huán)境變量,export可新增、修改和刪除環(huán)境變量,供后續(xù)執(zhí)行的程序使用。export設(shè)置的變量效用只在該次登錄中有效。
語(yǔ)法:export [-fnp] [變量名稱]=[變量設(shè)置值]
參數(shù):
-f代表[變量名稱中為]函數(shù)名稱。
-n刪除指定變量,實(shí)際上并未刪除,只是不會(huì)輸出到后續(xù)指令的執(zhí)行環(huán)境中。
-p列出所有shell賦予程序的環(huán)境變量,默認(rèn)參數(shù)。如:
Test@Ubuntu:~/code$ export //等同 export -pdeclare -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 mytestTest@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"
因?yàn)閑xport添加的環(huán)境變量是臨時(shí)有效,要想永久有效就得添加到文件中:
(1)在/etc/profile文件中添加變量,對(duì)所有用戶永久有效。例如:#vi /etc/profileexport CLASSPATH=./java_HOME/lib;$JAVA_HOME/jre/libexport PATH="$PATH:/home/Test" //在原PATH變量上添加數(shù)據(jù)
<span style="font-family: Arial, Helvetica, sans-serif;">注:修改文件后要想馬上生效還要運(yùn)行source /etc/profile,不然只能在下次重進(jìn)此用戶時(shí)生效。</span>(2)在用戶目錄下的.bash_profile(該文件在不同的linux系統(tǒng)下,文件名不同,有的是.profile,基本以profile結(jié)尾,可以用man bash查詢)文件中添加環(huán)境變量,對(duì)該用戶永久有效。用法跟上面相同。關(guān)于source,用法為:source FileName,作用是在當(dāng)前bash環(huán)境下讀取并執(zhí)行FileName中的命令,該FileName可以沒(méi)有執(zhí)行權(quán)限。注意該命令中的腳本是在當(dāng)前bash環(huán)境下執(zhí)行,沒(méi)有產(chǎn)生子shell,所以腳本添加的變量也能被當(dāng)前shell所共享,跟直接執(zhí)行腳本產(chǎn)生子shell不太一樣。如同樣的腳本Test.sh:
#!/bin/bash export mytest="Hi"用source Test.sh方式執(zhí)行,mytest環(huán)境變量就可以添加到當(dāng)前shell環(huán)境中,./Test.sh方式直接執(zhí)行則不能。另外,source命令常用“.”來(lái)代替。source Test.sh與 . Test.sh等效。:
新聞熱點(diǎn)
疑難解答
圖片精選