shell編程基礎二

1,獲取命令執行的結果,字符串拼接(腳本最常使用的功能)

 法一:

cmd_result=$(date +%Y%b%d)        //使用變量獲取命令執行的結果或者 cmd_result=`date +%Y%b%d`   反引號

 

mysqldump -uroot -pfeng --all jiale>/root/jiale$cmd_result.sql    //執行字符串和變量拼接,也可以使用${cmd_result}

 

法二:

name="aaa"

one="hello,$name"

echo $one

 

從文件中獲取數據並拼接成字符串:

item=""

for num in $(cat health_item.txt);do item="$item,$num";done

echo $item

 


2.使用#來註釋,以及腳本執行的方法

腳本的開頭一般是

#!/bin/sh

因爲腳本前兩個字符一般是#!,系統會將這兩個字符之後的字符作爲執行腳本的命令解釋器的絕對路徑(也可以是其他腳本解釋器的路徑)

腳本執行的三個方法

1chmod  u+x  腳本名        //給腳本執行權

         ./腳本名

2bash  腳本名                     //直接使用shell啓動命令一般比上面的方法要慢一些

         sh  腳本名

3)使用bash內部命令source“.”運行腳本

        source  腳本名

        . 腳本名               //“.”之後必須有一個空格


 

3,I/O重定向,管道(|)和後臺運行

 

cmd1 > file1

將命令1 的結果輸入到文件1

cmd1 > >file1

將命令1 的結果追加到文件1

cmd1 < file1

將文件1 的內容輸出作爲 命令 1執行

cmd1 << file1

將文件1 的內容追加命令 1

cmd1 2> file1

錯誤輸出重定向,命令1執行的錯誤信息會輸入給文件1

cmd1 &> file1

標準輸出與錯誤輸出重定向,標準輸出和錯誤輸出一起輸入到文件1中,屏幕將無顯示

 

命令1 |命令2|命令1

將命令1的結果,輸出給命令2,作爲命令2的輸入,再將命令2的結果輸出給命令3,作爲命令3的輸入

 

命令1 |&命令2|命令1

將命令1的標準結果和標準錯誤信息,輸出給命令2,作爲命令2的輸入,再將命令2的結果輸出給命令3,作爲命令3的輸入

 

在命令後加入&,可以讓命令到後臺運行

COMMAND &

# gcc   myproc.c&


4,命令執行順序

分號,多個命令用分號隔開,最後一個回車後,命令按順序執行

&&  連接連個命令,第一個命令執行成功後才能執行第二個命令 

||      連接連個命令,第一個命令執行失敗後才能執行第二個命令 

 


5,shell通配符

?       表示任意單個字符

*       表示任意長度字符

[ ]     表示匹配[  ]給定字符集合的任意一個字符

{ }    表示將{ }中的字符串,以及前導和後繼字符作爲匹配條件


6,單引號,雙引號,反引號

單引號括起來的字符都會變成普通字符串

雙引號括起來的字符除 $ "  `  \  外都會變成普通字符串

反引號括起來的字符串會被作爲命令執行

 

 


7 declare [-afirx]  聲明變量類型

-a    定義爲數組

-f     定義爲函數

-i     定義爲整數

-r     定義爲只讀

-x     定義爲通過環境輸出比變量

 

declare -i    plaus=1+2+4*4-5

echo  plaus

 


 

8 test命令(如果不想使用tset可以使用“[ 表達式 ]”來代替,表達式前後有空格)

 

test  -e  file        測試文件是否存在,存在爲真

test -d  file         測試文件是否存在且是目錄,是則爲真

test  -x  file        測試文件是否存在且可以執行,是則爲真

test  -r  file        測試文件是否存在且爲只讀,是則爲真

test  -w  file       測試文件是否存在且可寫入,是則爲真

 

test  -b  file       測試文件是否存在且爲塊設備,是則爲真

test  -c   file       測試文件是否存在且爲字符設備,是則爲真

test  -s   file       測試文件是否存在且長度大於0,是則爲真

test  -f   file       測試文件是否存在且是普通文件,是則爲真

 

9 數值比較測試

-eq       等於

-ne       不等於

-gt        大於

-lt         小於

-ge       大於等於

-le        小於等於

 

10  字符串比較測試

-z     s1      如果字符串s1的長度是0,值爲真

-n     s2     如果字符串s1的長度不爲0,值爲真

s1=s2       相等值爲真

s1!=s2      不相等值爲真

s1              如果字符串s1不是空串,值爲真

 

 


11  控制結構

11.1   if  then  else  fi

 

echo "press y to continue"

read yn

if [ "$yn"="y" ] || [ "$yn"="Y"]; then echo "script is running"

else

echo "Stop"

fi

 

11.2   case  ......esac

 

echo "press you select "

read number

 

case  $number  in                       //如果沒有read 交互式輸入,直接輸入使用$1   case  $1  in   

one)   echo   "you choice is one"

;;

 

tw0)     echo   "you choice is two"

;;

 

*)     echo   "Usage {one|two}"

exit 1

esac

 

11.3   for (( 條件1;條件2;條件3))

for var    in   var1   var2  var3

 

 

 

while[ 條件1 ] && { || }  [ 條件2 ]      當條件符合時就繼續

until [ 條件1 ] && { || }  [ 條件2 ]       直到條件符合時才繼續

 

函數

函數名() {

 

 

}

 

For循環的寫法:

item=""

for num in $(cat health_item.txt);do item="$item,$num";done

echo $item

 

 


12  腳本調試

sh  [-nvx]   script.sh

-n   不執行腳本,查詢腳本內容語法,錯誤則列出    sh -n   script.sh

-v   執行腳本之前先把腳本內容顯示在屏幕上

-x   將用到的腳本內容顯示在屏幕上

 

13  For循環詳解

shell裏面,關於循環的語句很多,最簡單的一個
for .. in ..

do
    ...
done

這樣的結構就是一個簡單的循環,將列表中的每一個條目都循環一次。
瞭解編程的人都知道forwhile循環的區別:

while
until的循環方式是必須要符合某個條件的狀態,再循環

for
這種語法則是已經知道將要進行幾次循環的狀態。

所以for循環的語法結構如下:

for var in con1  con2 con3...
do
   
程序段

done
就上面的語法結構來說,這個var的變數內容在循環工作的時候:

1
第一次循環時,var的內容是con1

2
第二次循環時,var的內容是con2

3
第三次循環時,var的內容是con3

......
例子:

for f in test*; do mv $f $f.log;done
將文件夾中test開頭的文件重命名爲testXXX.log

關於for比較全的用法

1 for((i=1;i<=10;i++));do echo $(expr $i \* 4);done
2
、在shell中常用的是
for i in $(seq 10)
3
for i in `ls`
4
for i in ${arr[@]}
5
for i in $* ; do
6
for File in /proc/sys/net/ipv4/conf/*/accept_redirects; do
7
for i in f1 f2 f3 ;do
8
for i in *.txt
9
for i in $(ls *.txt)
for in
語句與` `$( )合用,利用` `$( )的將多行合爲一行的缺陷,實際是合爲一個字符串數組

##for num in $(seq 1 100)
10
LIST="rootfs usr data data2"
for d in $LIST; do
for in語句自動對字符串按空格遍歷的特性,對多個目錄遍歷

11
for i in {1..10}
12
for i in stringchar {1..10}
13
awk 'BEGIN{for(i=1; i<=10; i++) print i}'
注意:AWK中的for循環寫法和C語言一樣的

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章