SHELL編程基礎01

首先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 本文歡迎轉載,但未經做者贊成必須保留此段聲明,且在文章頁面明顯位置給出原文鏈接,不然視爲侵權。

相關文章
相關標籤/搜索