首先shell是在linux下運行的一種環境,它是以shell腳原本運行的,學會了它基本能夠解決任何問題,也能夠用shell腳本開發。java
和java,python的相比,其弱類型的語言沒有那麼複雜的結構,編程講究習慣,寫代碼時也要遵循這個習慣,就像這個是老祖宗 定的規則同樣python
shell腳本代碼習慣linux
我整理了一些你們當作參考:面試
1 數字不加引號
單引號表示字符串或者固定不變的字符
其餘都用雙引號shell
2 寫腳本第一行加入#!/bin/bash sh腳本的習慣(不要問什麼)編程
變量數組
變量是存儲的數據的方式tomcat
只讀變量bash
#!/bin/sh NAME="nihaoma" readonly NAME NAME="wobuhaoa"
這樣變量會報錯,由於設置了只讀app
取消定義變量
unset 變量名稱
若是變量沒有被定義能夠用echo ${變量名:-自定義內容} ,返回自定義內容。若是有定義返回變量值,此可判斷變量沒有定義,確保變量有值
=,表示若是變量沒有定義,直接給變量賦自定義的值
變量的類型
變量類型分爲全局變量,局部變量和shell變量(shell自帶的變量)
shell特殊變量
$0 獲取文件當前的文件名 包括路徑
$n 獲取當前執行shell腳本的第n個參數 n=1...9 若是n>9 用大括號 ${10}
sh n.sh das 213d
腳本里面寫 echo $1 $2 $3
運行sh n.sh das 213d
結果爲das 213d 其對應的就是腳本後面的參數,$3沒有>參數就沒了
$! 執行上一個指令的PID
$* 獲取當前shell的全部參數 $1 $2 $3 ...
$# 執行命令行參數的總個數
dirname $0 取全路徑
basename $0 取名稱
$? 對於上一個命令判斷是否成功成功返回0
2權限拒絕 1-125運行失敗 126找到命令可是沒法執行 127未找到該命令 >128命令被強制結束
$$ 取進程號
$@ 這個程序的全部參數 $1 $2 $3
$_ 在此以前執行的命令或腳本的最後一個參數
shift語句
其按照以下方式從新命名全部位置參數變量,即$2成爲$1,$3成爲$2***在程序中每使用一次shift語句,都使全部的位置參數依次向移動一個位置,並使位置參數$#減1,直到減到0爲止
變量的獲取
↑查看變量字符數 或者echo $a | wc -m
↑取第三個字符到結尾 也能夠理解成刪除前兩個字符
↑取第三個字符總共兩個
或者 echo ${a} |cut -c 3-4
↑從開頭刪除最短匹配的字符,##最長
↑從結尾刪除最短匹配的,%%最長
${變量/舊字符串/新字符串} 若變量內容符合「舊字符串」,則首個舊字符會被新字符替換。
${變量/舊字符串//新字符串} 若變量內容符合「舊字符串」,則所有舊字符會被新字符替換。
批量文件名修改實戰
將下面文件用shell去除_strong
chen_1995_1_2_strong.jpg
chen_1995_1_3_strong.jpg
chen_1995_1_4_strong.jpg
chen_1995_1_5_strong.jpg
1.首先造數據
vi a.log ,將文件名複製進去
2.寫造數據的shell命令
for f in `cat a.log`;
do `touch $f`; done
3.寫修改文件名的shell腳本
vi aaa.sh
for f in `ls *.jps`
do
mv $f `echo ${f%_strong*}.jpg`; done
替換也是同樣,批量更名
rename .JPG .HTML *.jpg
原來的名稱 改的名稱 原來文件名
shell計算方式
普通計算
命令行傳參
let計算
expr 計算
注意:中間要加空格不然不累加 乘號前面要加轉義符,除號後面試了下能夠不加
bc 計算(支持小數)
bc計算能夠經過管道符也能夠直接bc進入bc運算,最後試了下好像也不支持小數
DATE時間獲取
#!/bin/bash YY=`date +%Y` #獲取年 echo $YY mm=`date +%m` #獲取月 echo $mm DD=`date +%d` #獲取日 echo $DD HH=`date +%H` #獲取小時 echo $HH MM=`date +%M` #獲取分 echo $MM dd=`date +%S` #獲取秒 echo $dd hello=$YY$mm$DD$HH$MM$dd echo $hello bigone=`date +%Y%m%d%H%M%S` #獲取精確時間 echo $bigone a=10 b=10 if [ $hello -eq $bigone ] then echo true else echo false fi
if判斷
條件表達式
[ aaaa ] -eq [ bbbb ] 中括號兩邊要帶空格
-eq 測試兩個整數是否相等
-ne 測試兩個整數是否不等
-gt 測試一個數是否大於另外一個數
-lt 測試一個數是否小於另外一個數
-ge 大於或等於
-le 小於或等於
組合測試條件
-a: and
-o: or
!: 非
邏輯與:&&
第一個條件爲假 第二個條件不用在判斷,最總結果已經有
第一個條件爲真,第二個條件必須得判斷
邏輯或:||
只要有一個條件爲真,直接判斷爲真
字符串比較
== 等於 兩邊要有空格
!= 不等
> 大於
< 小於
文件判斷
-z string 測試指定字符是否爲空,空着真,非空爲假
-n string 測試指定字符串是否爲不空,空爲假 非空爲真
-e FILE 測試文件是否存在
-f file 測試文件是否爲普通文件
-d file 測試指定路徑是否爲目錄
-r file 測試文件對當前用戶是否可讀
-w file 測試文件對當前用戶是否可寫
-x file 測試文件對當前用戶是均可執行
-z 是否爲空 爲空則爲真
-a 是否不空
a="sadasdasd" if [ -z $a ]; then echo kong else echo bukong fi
if語法
if 判斷條件 0爲真 其餘都爲假
單分支if語句
if 判斷條件;then
statement1
statement2
.......
fi
雙分支的if語句
複製代碼
if 判斷條件;then
statement1
statement2
.....
else
statement3
statement4
fi
以下:
read -p "please input your grade:" x declare -i x if [ "$x" == "" ];then echo "you must input the word in it" exit 5 fi if [ $x -eq 100 ];then echo "你已經超神了" elif [ $x -ge 90 -a $x -le 99 ];then echo "變態殺戮" elif [ $x -ge 80 -a $x -le 89 ];then echo "大波kill" elif [ $x -ge 70 -a $x -le 79 ];then echo "one kill" elif [ $x -ge 60 -a $x -le 69 ];then echo "first brood" elif [ $x -ge 0 -a $x -le 59 ];then echo "對面已經超神了" else echo "非異常處理" fi
case..esac語句
#!/bin/sh FRUIT="balabala" case "$FRUIT" in "apple") echo "Apple pie is quite tasty." ;; "banana") echo "I like banana nut bread." ;; "balabala") echo "New Zealand is famous for balabala." ;; esac
格式跟c差很少
shell循環類型 while,for,until,select循環
while 循環直到達到條件循環中止
#!/bin/sh a=0 while [ $a -lt 10 ] do echo $a a=`expr $a + 1` done
for for var in word1 word2 ... wordN
#!/bin/sh #執行in後面的數並打印 for var in 0 1 2 3 4 5 6 7 8 9 do echo $var done
#!/bin/sh #home目錄下打印跟.bash後面全部的文件 for FILE in $HOME/.bash* do echo $FILE done #這將產生如下結果: /root/.bash_history /root/.bash_logout /root/.bash_profile /root/.bashrc
util
#!/bin/sh #util英文是直到的意思,解釋就是直到a=10的時候循環才結束 a=0 until [ ! $a -lt 10 ] do echo $a a=`expr $a + 1` done
select
語法:
select var in word1 word2 ... wordN do Statement(s) to be executed for every word. done
#!/bin/ksh select DRINK in tea cofee water juice appe all none do case $DRINK in tea|cofee|water|all) echo "Go to canteen" ;; juice|appe) echo "Available at home" ;; none) break ;; *) echo "ERROR: Invalid selection" ;; esac done
break&continue
break 結束整個循環
#!/bin/sh a=0 while [ $a -lt 9 ] do echo $a if [ $a -eq 5 ] then break fi a=`expr $a + 1` done
continue 終止本次循環執行下一次循環
shell替換
#!/bin/sh DATE=`date` echo "Date is $DATE" USERS=`who | wc -l` echo "Logged in user are $USERS" UP=`date ; uptime` echo "Uptime is $UP"
結果:
shell 定時清理
若是要清理tomcat下的logs日誌,首先定義腳本存放目錄
建立腳本代碼以下
#!/bin/bash find /usr/local/tomcat/logs/ -mtime 10 -name "*.log" -exec rm -rf {} \; find /usr/local/tomcat/logs/ -mtime 10 -name "*.txt" -exec rm -rf {} \;
以後crontab -e 腳本以下
30 0 * * * 腳本路徑 腳本文件
shell數組
定義數組值
array_name[index]=value 數據名[下標]=值
若是您使用的是ksh shell在這裏初始化數組的語法:
set -A array_name value1 value2 ... valuen
若是您使用的是bash shell中,這裏是初始化數組的語法:
array_name=(value1 ... valuen)
訪問數組值
${array_name[index]} 訪問指定下標
${array_name[*]} 訪問全部
${array_name[@]} 訪問全部
版權聲明:本文原創發表於 博客園,做者爲 RainBol 本文歡迎轉載,但未經做者贊成必須保留此段聲明,且在文章頁面明顯位置給出原文鏈接,不然視爲侵權。