循環(huán)
for循環(huán)
通過(guò)使用一個(gè)變量去遍歷給定列表中的每個(gè)元素,在每次變量賦值時(shí)執(zhí)行一次循環(huán)體,直至賦值完成所有元素退出循環(huán)
格式1
?。踛ava] view plain copyfor ((i=0;i《10;i++))
do
。。。
Done
格式2
?。踛ava] view plain copyfor i in 0 1 2 3 4 5 6 7 8 9
do
。。。
Done
格式3
[java] view plain copyfor i in {0..9}
do
。。。
done
注意:for i in {0..9} 等于for i in {0..9..1} , 第三個(gè)參數(shù)為跨步。
例如:
{0..9..2} 表示 0,2,4,6,8
while循環(huán)
適用于循環(huán)次數(shù)未知,或不便用for直接生成較大的列表時(shí)
格式:
[java] view plain copywhile 測(cè)試條件
do
循環(huán)體
done
如果測(cè)試條件為“真”,則進(jìn)入循環(huán),測(cè)試條件為假,則退出循環(huán)。
打印結(jié)果為0~9.
循環(huán)控制
循環(huán)控制命令——break
break命令是在處理過(guò)程中跳出循環(huán)的一種簡(jiǎn)單方法,可以使用break命令退出任何類型的循環(huán),包括while循環(huán)和for循環(huán)
循環(huán)控制命令——continue
continue命令是一種提前停止循環(huán)內(nèi)命令,而不完全終止循環(huán)的方法,這就需要在循環(huán)內(nèi)設(shè)置shell不執(zhí)行命令的條件
條件
bash條件測(cè)試
格式:
[java] view plain copytest EXPR
?。?EXPR ]:注意中括號(hào)和表達(dá)式之間的空格
整型測(cè)試:
-gt:大于:
-lt:小于
-ge:大于等于
-le:小于等于
-eq:等于
-ne:不等于
例如[ $num1 -gt $num2 ]或者test $num1 -gt $num2
字符串測(cè)試:
=:等于,例如判斷變量是否為空 [ “$str” = “” ] 或者[ -z $str ]
?。?:不等于
判斷
if判斷:
單分支
?。踛ava] view plain copy if 測(cè)試條件;then
選擇分支
fi
雙分支
?。踛ava] view plain copyif 測(cè)試條件
then
選擇分支1
else
選擇分支2
fi
多分支
?。踛ava] view plain copyif 條件1; then
分支1
elif 條件2; then
分支2
elif 條件3; then
分支3
。。。
else
分支n
i
雙分支示例:
Case判斷
有多個(gè)測(cè)試條件時(shí),case語(yǔ)句會(huì)使得語(yǔ)法結(jié)構(gòu)更清晰
格式:
?。踛ava] view plain copycase 變量引用 in
PATTERN1)
分支1
;;
PATTERN2)
分支2
;;
。。。
*)
分支n
;;
esac
PATTERN :類同于文件名通配機(jī)制,但支持使用|表示或者
a|b:a或者b
*:匹配任意長(zhǎng)度的任意字符
???:匹配任意單個(gè)字符
?。踑-z]:指定范圍內(nèi)的任意單個(gè)字符
示例:
算術(shù)運(yùn)算
[java] view plain copylet varName=算術(shù)表達(dá)式
varName=$[算術(shù)表達(dá)式]
varName=$((算術(shù)表達(dá)式))
varName=`expr $num1 + $num2`
使用這種格式要注意兩個(gè)數(shù)字和+號(hào)中間要有空格。
示例:
邏輯運(yùn)算符
if [ 條件A && 條件B ] 在shell中怎么寫(xiě)?
if [ 條件A && 條件B ];then 是不對(duì)的
解決方法:
?。?)需要用到shell中的邏輯操作符
-a 與
-o 或
??! 非
如if [ 條件A -a 條件B ]
?。?)if [ 條件A ] && [條件B ]
?。?)if((A&&B))
?。?)if [[ A&&B ]]
自定義函數(shù)
格式:
?。踛ava] view plain copyfunction 函數(shù)名(){
。。。
}
引用自定義函數(shù)文件時(shí),使用source func.sh
有利于代碼的重用性
函數(shù)傳遞參數(shù)(可以使用類似于Java中的args,args[1]代表Shell中的$1)
函數(shù)的返回值,只能是數(shù)字
read
read命令接收標(biāo)準(zhǔn)輸入(鍵盤(pán))的輸入,或者其他文件描述符的輸入。得到輸入后,read命令將數(shù)據(jù)放入一個(gè)標(biāo)準(zhǔn)變量中。
格式
?。踛ava] view plain copyread VAR_NAME
read如果后面不指定變量,那么read命令會(huì)將接收到的數(shù)據(jù)放置在環(huán)境變量REPLY中
?。踛ava] view plain copy#表示輸入時(shí)的提示字符串:
read -p “Enter your name:” VAR_NAME
?。踛ava] view plain copy# -t表示輸入等待的時(shí)間
read -t 5 -p “enter your name:” VAR_NAME
?。踛ava] view plain copy# -s 表示安全輸入,鍵入密碼時(shí)不會(huì)顯示
read -s -p “Enter your password: ” pass
declare
用來(lái)限定變量的屬性
-r 只讀
-i 整數(shù):某些算術(shù)計(jì)算允許在被聲明為整數(shù)的變量中完成,而不需要特別使用expr或let來(lái)完成。
-a 數(shù)組
示例:
字符串操作
獲取長(zhǎng)度:
?。踛ava] view plain copy${#VAR_NAME}
字符串截取
[java] view plain copy${variable:offset:length}或者${variable:offset}
取尾部的指定個(gè)數(shù)的字符
?。踛ava] view plain copy${variable: -length}:注意冒號(hào)后面有空格
大小寫(xiě)轉(zhuǎn)換
小--》大:
?。踛ava] view plain copy${variable^^}
大--》小:
?。踛ava] view plain copy${variable,,}
示例:
數(shù)組
定義:declare -a:表示定義普通數(shù)組
特點(diǎn)
支持稀疏格式
僅支持一維數(shù)組
數(shù)組賦值方式
一次對(duì)一個(gè)元素賦值a[0]=$RANDOM
一次對(duì)多個(gè)元素賦值a=(a b c d)
按索引進(jìn)行賦值a=([0]=a [3]=b [1]=c)
使用read命令read -a ARRAY_NAME查看元素
?。踛ava] view plain copy${ARRAY[index]}:查看數(shù)組指定角標(biāo)的元素
${ARRAY}:查看數(shù)組的第一個(gè)元素
${ARRAY[*]}或者${ARRAY[@]}:查看數(shù)組的所有元素
獲取數(shù)組的長(zhǎng)度
?。踛ava] view plain copy${#ARRAY[*]}
${#ARRAY[@]}
獲取數(shù)組內(nèi)元素的長(zhǎng)度
?。踛ava] view plain copy${#ARRAY[0]}
注意:${#ARRAY[0]}表示獲取數(shù)組中的第一個(gè)元素的長(zhǎng)度,等于${#ARRAY}
從數(shù)組中獲取某一片段之內(nèi)的元素(操作類似于字符串操作)
格式:
?。踛ava] view plain copy${ARRAY[@]:offset:length}
offset:偏移的元素個(gè)數(shù)
length:取出的元素的個(gè)數(shù)
${ARRAY[@]:offset:length}:取出偏移量后的指定個(gè)數(shù)的元素
${ARRAY[@]:offset}:取出數(shù)組中偏移量后的所有元素
數(shù)組刪除元素:
?。踛ava] view plain copyunset ARRAY[index]
示例:
其他命令
date
顯示當(dāng)前時(shí)間
格式化輸出 +%Y-%m-%d
格式%s表示自1970-01-01 00:00:00以來(lái)的秒數(shù)
指定時(shí)間輸出 --date=‘2009-01-01 11:11:11’
指定時(shí)間輸出 --date=‘3 days ago’ (3天之前,3天之后可以用-3)
示例:
后臺(tái)運(yùn)行腳本
在腳本后面加一個(gè)&
?。踛ava] view plain copytest.sh &
這樣的話雖然可以在后臺(tái)運(yùn)行,但是當(dāng)用戶注銷(xiāo)(logout)或者網(wǎng)絡(luò)斷開(kāi)時(shí),終端會(huì)收到Linux HUP信號(hào)(hangup)信號(hào)從而關(guān)閉其所有子進(jìn)程
nohup命令
不掛斷的運(yùn)行命令,忽略所有掛斷(hangup)信號(hào)
?。踛ava] view plain copynohup test.sh &
nohup會(huì)忽略進(jìn)程的hangup掛斷信號(hào),所以關(guān)閉當(dāng)前會(huì)話窗口不會(huì)停止這個(gè)進(jìn)程的執(zhí)行。
nohup會(huì)在當(dāng)前執(zhí)行的目錄生成一個(gè)nohup.out日志文件
標(biāo)準(zhǔn)輸入、輸出、錯(cuò)誤、重定向
標(biāo)準(zhǔn)輸入、輸出、錯(cuò)誤可以使用文件描述符0、1、2引用
使用重定向可以把信息重定向到其他位置
ls 》file 或者 ls 1》file(ls 》》file)
lk 2》file(lk是一個(gè)錯(cuò)誤命令)
ls 》file 2》&1
ls 》 /dev/null(把輸出信息重定向到無(wú)底洞)
例子:
?。踛ava] view plain copycommand 》/dev/null 2》&1
Crontab定時(shí)器
linux下的定時(shí)任務(wù)
編輯使用crontab -e
一共6列,分別是:分 時(shí) 日 月 周 命令
查看crontab執(zhí)行日志
[java] view plain copytail -f /var/log/cron
必須打開(kāi)rsyslog服務(wù)cron文件中才會(huì)有執(zhí)行日志(service rsyslog status)
[java] view plain copytail -f /var/spool/mail/root(查看crontab最近的執(zhí)行情況)
查看cron服務(wù)狀態(tài)
[java] view plain copyservice crond status
啟動(dòng)cron服務(wù)
[java] view plain copyservice crond start
小結(jié)及示例:
基本格式 :
* * * * * command
分 時(shí) 日 月 周 命令
第1列表示分鐘1~59 每分鐘用*或者 */1表示
第2列表示小時(shí)1~23(0表示0點(diǎn))
第3列表示日期1~31
第4列表示月份1~12
第5列標(biāo)識(shí)號(hào)星期0~6(0表示星期天)
第6列要運(yùn)行的命令
crontab文件的一些例子:
30 21 * * * /usr/local/etc/rc.d/lighttpd restart
上面的例子表示每晚的21:30重啟apache。
45 4 1,10,22 * * /usr/local/etc/rc.d/lighttpd restart
上面的例子表示每月1、10、22日的4 : 45重啟apache。
10 1 * * 6,0 /usr/local/etc/rc.d/lighttpd restart
上面的例子表示每周六、周日的1 : 10重啟apache。
0,30 18-23 * * * /usr/local/etc/rc.d/lighttpd restart
上面的例子表示在每天18 : 00至23 : 00之間每隔30分鐘重啟apache。
0 23 * * 6 /usr/local/etc/rc.d/lighttpd restart
上面的例子表示每星期六的11 : 00 pm重啟apache。
* */1 * * * /usr/local/etc/rc.d/lighttpd restart
每一小時(shí)重啟apache
* 23-7/1 * * * /usr/local/etc/rc.d/lighttpd restart
晚上11點(diǎn)到早上7點(diǎn)之間,每隔一小時(shí)重啟apache
0 11 4 * mon-wed /usr/local/etc/rc.d/lighttpd restart
每月的4號(hào)與每周一到周三的11點(diǎn)重啟apache
0 4 1 jan * /usr/local/etc/rc.d/lighttpd restart
一月一號(hào)的4點(diǎn)重啟apache
ps和jps
ps:用來(lái)顯示進(jìn)程的相關(guān)信息
ps顯示當(dāng)前shell啟動(dòng)的所有進(jìn)程
ps -e顯示系統(tǒng)中所有進(jìn)程
ps -ef|grep java
jps:類似linux的ps命令,不同的是ps是用來(lái)顯示所有進(jìn)程,而jps只顯示java進(jìn)程,準(zhǔn)確的說(shuō)是顯示當(dāng)前用戶已啟動(dòng)的部分java進(jìn)程信息,信息包括進(jìn)程號(hào)和簡(jiǎn)短的進(jìn)程command。
問(wèn)題:某個(gè)java進(jìn)程已經(jīng)啟動(dòng),用jps卻顯示不了該進(jìn)程進(jìn)程號(hào),使用ps -ef|grep java卻可以看到?
java程序啟動(dòng)后,默認(rèn)(請(qǐng)注意是默認(rèn))會(huì)在/tmp/hsperfdata_userName目錄下以該進(jìn)程的id為文件名新建文件,并在該文件中存儲(chǔ)jvm運(yùn)行的相關(guān)信息,其中的userName為當(dāng)前的用戶名,/tmp/hsperfdata_userName目錄會(huì)存放該用戶所有已經(jīng)啟動(dòng)的java進(jìn)程信息。而jps、jconsole、jvisualvm等工具的數(shù)據(jù)來(lái)源就是這個(gè)文件(/tmp/hsperfdata_userName/pid)。所以當(dāng)該文件不存在或是無(wú)法讀取時(shí)就會(huì)出現(xiàn)jps無(wú)法查看該進(jìn)程號(hào)。
原因:1,磁盤(pán)讀寫(xiě)、目錄權(quán)限問(wèn)題。2,臨時(shí)文件丟失,被刪除或是定期清理。3,java進(jìn)程信息文件存儲(chǔ)地址被設(shè)置,不在/tmp目錄下
登錄Shell和交互shell
交互式的:顧名思義,這種shell中的命令時(shí)由用戶從鍵盤(pán)交互式地輸入的,運(yùn)行的結(jié)果也能夠輸出到終端顯示給用戶看。
非交互式的:這種shell可能由某些自動(dòng)化過(guò)程啟動(dòng),不能直接從請(qǐng)求用戶的輸入,也不能直接輸出結(jié)果給終端用戶看。輸出最好寫(xiě)到文件。比如使用Shell腳本。
登錄式:意思是這種是在某用戶由/bin/login登陸進(jìn)系統(tǒng)后啟動(dòng)的shell,跟這個(gè)用戶綁定。這個(gè)shell是用戶登陸后啟動(dòng)的第一個(gè)進(jìn)程。login進(jìn)程在啟動(dòng)shell時(shí)傳遞第0個(gè)參數(shù)指明shell的名字,該參數(shù)第一個(gè)字符為“-”,指明這是一個(gè)login shell。比如對(duì)bash而言,啟動(dòng)參數(shù)為“-bash”。
非登錄式:不需login而由某些程序啟動(dòng)的shell。傳遞給shell的參數(shù),是沒(méi)有‘-’前綴的。還以Bash為例,當(dāng)以非login方式啟動(dòng)時(shí),它會(huì)調(diào)用~/.bashrc,隨后~/.bashrc中調(diào)用/etc/bashrc,最后/etc/bashrc調(diào)用所有/etc/profile.d目錄下的腳本。
一旦打開(kāi)一個(gè)交互式login shell,或者以--login選項(xiàng)登錄的非交互式shell,都會(huì)首先加載并執(zhí)行/etc/profile中的命令,然后再依次加載~/.bash_profile, ~/.bash_login, 和~/.profile中的命令。
當(dāng)bash以login shell啟動(dòng)時(shí),它會(huì)執(zhí)行/etc/profile中的命令,然后/etc/profile調(diào)用/etc/profile.d目錄下的所有腳本;然后執(zhí)行~/.bash_profile,~/.bash_profile調(diào)用~/.bashrc,最后~/.bashrc又調(diào)用/etc/bashrc。要識(shí)別一個(gè)shell是否為login shell,只需在該shell下執(zhí)行echo $0。
注意: /etc/profile中的設(shè)置只對(duì)Login Shell生效,而crontab運(yùn)行腳本的shell環(huán)境是non-login的,不會(huì)加載/etc/profile的設(shè)置。
評(píng)論
查看更多