linux shell編程進階學習(轉)

第一節:基礎

ls -lh  ——能夠用戶友好的方式看到文件大小html

file 文件名 ——查看文件類型mysql

stat 文件名 ——查看文件當前狀態linux

man 命令/函數名 ——查看詳細的幫助文檔正則表達式

man中看某一命令選項的定位技巧  —— 輸入/ -n -n前面要有必定的空格sql

 

#!/bin/bashshell

echo 「Hello World!」編程

chmod 777 hello.sh或chmod a+x hello.sh等vim

./hello.sh執行安全

 

echo -e選項用來加強,支持轉義字符。bash

var=world

echo 「hello $var \n」 ——輸出hello world \n

echo -e 「hello $var \n」 ——輸出hello world後有換行 

 

echo -e "\033[32;40mHELLO YOU \033[0m" 

——輸出不一樣顏色的字體,以\033[開頭,

——\033[0m結尾,3x是前景色,4x是背景色 

 

第二節:變量

set/declare ——查看環境變量

env ——查看環境變量 

二者是有區別的,set/declare顯示全部的本地變量,env是獲取環境變量

unset 變量名 ——取消變量

 

shell中全部變量都是字符串,變量區分大小寫,如foo和Foo是不一樣的變量;

變量必須以字母或下劃線開頭;

變量名和值之間沒有空格:MSG=Hello √  MSG=  Hello×

只讀變量用readonly: readonly MSG=12   MSG=13×

變量引用:echo $var / echo ${var} 後者更加嚴格

修改環境變量:PATH=$PATH:/bin/opt

永久修改環境變量:vim ~/.bashrc;export PATH=${PATH}:/bin/opt ;source .bashrc

 

補充:

/etc/profile:

此文件爲系統的每一個用戶設置環境信息,當用戶第一次登陸時,該文件被執行.
並從/etc/profile.d目錄的配置文件中搜集shell的設置.

/etc/bashrc:

爲每個運行bash shell的用戶執行此文件.當bash shell被打開時,該文件被讀取.

~/.bash_profile:

每一個用戶均可使用該文件輸入專用於本身使用的shell信息,當用戶登陸時,該
文件僅僅執行一次!默認狀況下,他設置一些環境變量,執行用戶的.bashrc文件. 

~/.bashrc:

該文件包含專用於你的bash shell的bash信息,當登陸時以及每次打開新的shell時,該
該文件被讀取.

~/.bash_logout:

當每次退出系統(退出bash shell)時,執行該文件. 
另外,/etc/profile中設定的變量(全局)的能夠做用於任何用戶,而~/.bashrc等中設定的變量(局部)只能繼承/etc/profile中的變量,他們是"父子"關係. 

注意他們之間有執行的優先級; 

 

第三節:重定向

輸出重定向

ls -l > dat.txt ——重定向到文件,會建立新文件

ls -l >> dat.txt ——追加到文件末尾

ls -l > /dev/null ——空洞文件

ls xxx > txt  ——文件不存在,則沒法重定位,會輸出錯誤信息

ls xxx > txt 2>&1 ——成功,1表明標準輸出,2>&1表示2等同於1

 

輸入重定向

cat >> dat.txt <<R   ——表示以R結束!(輸入想要的數據後輸入R結束)

read var <dat.txt ——將dat.txt中的第一行做爲值付給變量var

 

管道

du -ah | sort -n ——列出一個目錄的全部文件,按文件大小排序

ps aux | grep MySQL ——查看服務

rpm -qa | grep vsftpd ——查看軟件是否已經安裝可使用這個方法 

 

第四節:數學運算

(expr   ()   let)

expr 1 + 2 ——注意要有空格 expr格式要求較高

var=$(expr 1 \* 8) ——*要用轉義

 

TMP=$((1+2)) ——直接使用() 不用空格

 

let var=3*8

echo $var 

計劃任務crontab -e進入編輯

 

 

第五節:引用

1.雙引號:使用雙引號能夠輸出除$、`、\ 之外的任意字符

echo 「$hello world」 ——輸出 world

2.單引號:使用單引號會忽略任何的引用值

hello=10   echo ‘$hello’——輸出$hello

3.反引號:用於將系統命令輸出到變量

echo `ls` ——至關於執行ls命令

echo 「`ls` Hello world」 ——執行ls命令後繼續打印hello world

4.反斜線:防止shell誤解特殊含義的字符

如&  *  +  |  ?   $等等

 

第六節:grep和正則表達式

1.grep經常使用 grep -n(顯示行號)  -r(遞歸)   -v(取反)  --color  --include等選項。

grep -nr 「Hello」 /home /var --include=*.c

2.正則表達式

元字符:[ ]  \  ^  $  . ?  |  *  +  (  )

 

^  ——匹配行首 ls | grep ^[0-9]以0-9開頭的;  ls |grep ^[^A]以非A開頭的

$  ——匹配行尾 ls | grep c$以c結尾的, 還可使用’ ’  ls |grep ‘^[m]c$’

*  ——匹配0次或屢次

?  ——匹配0次或1次

.  ——匹配任意單字符

partten\{n\}    ——匹配前面partten出現次數 n爲次數

grep --color '^[0-9]\{3\}' txt

partten\{n,\}    ——匹配前面partten出現次數 n爲至少出現次數

grep --color '^[0-9]\{1,\}' txt

partten\{n,m\}  ——匹配前面partten出現次數 出現次數爲n-m之間

grep --color '^[0-9]\{1,3\}' txt

3.匹配開頭和結尾字符

grep ‘^[hello]’ txt ——以hello開頭,或grep ‘^hello’ txt

grep ‘hello$’ txt ——以hello結尾的單詞

grep ‘^\bHello\b’ txt ——匹配整個單詞Hello  

 

第七節:sed命令

-n -p選項

sed  ‘p’ filename  ——查看文件內容 p表明print 注意:會顯示兩行

sed -n ‘p’ filename ——加上-n 表示只輸出模式空間的內容

sed -n ‘1 p’ filename  ——只打印第一行 2 p打印前兩行

sed -n ‘1,3 p’ filename  ——打印1-3行

sed -n ‘/main/ p’ file ——打印含有main的行

sed -n ‘/^main/ p’ file ——打印以main開頭的行

sed -n ‘/main$/ p’ file ——打印以main結尾的行

sed -n ‘/^[0-9]/\{3\} p’ file——以數字開頭 並出現三次

 

-d選項(delete),與p用法相似:

sed ‘1,3 d’ file ——刪除1-3行

 

-f選項:從文件中讀入命令 創建文件cmd.sed 如內容:/main/ p

sed -f cmd.sed  filename

 

-e選項:後面能夠接多個命令

sed -n ‘/main/ p’ -e ‘/hello/ p’  filename

 

-i重要!

-i選項,會直接操做到文件內容

-s替換:

sed ‘1 s/main/hello/’ filename ——把第一行中main換成hello

sed ‘/main/ s/he/llo/’ filename ——把main所在字符串所在中he換成llo

sed ‘2  /main/ s/he/llo/’ filename ——把第二行且含有main的行中he換成llo

 

若是沒有address-range和partten-range,就會操做到全部行,如

sed  ‘s/main/hello/’ filename ——把全部行中的main換成hello

 

substitute-flags:

g(global):全局開關   sed  ‘s/main/hello/g’ filename

數字:把每一行第n個符合條件的替換 sed  ‘s/main/hello/2’ filename 

      第二個出現的main

p:打印,很少說

w(write):輸出到文件 sed ‘ s/main/hello/w out.txt’ filename

i(ignore):忽略大小寫

 

各類標記能夠聯合使用:

   sed ‘s/main/fuck/gipw 2.txt’  filename 

&:

   sed ‘s/main/[&]/’ filename 把每一行main換爲[main]

 

實例:ll > txt

txt中內容以下:

總用量 32

drwxrwxr-x.  7 xxx xxx 4096 10月 18 20:19 install

-rw-rw-r--.  1 xxx xxx 0 12月 18 21:12 txt

drwxr-xr-x.  9 xxx xxx 4096  9月  5 17:22 vim

drwxrwxr-x.  9 xxx xxx 4096 12月 15 21:48 work

我只想要獲得txt那一行的21:12

怎麼作?

答案:

cat txt | grep txt | sed 's/.*..:...*/\1/g'

 

   又如echo "hello my world" | sed 's/.*my.*/[\1]/'這樣輸出:[my] 

 

 

第八節.AWK命令

awk命令

比較好的參考資料:

http://www.cnblogs.com/ggjucheng/archive/2013/01/13/2858470.html

格式1:awk -Fs ‘BEGIN{ } / parten/ {action} END{ }’

action中的內容會循環執行 begin與end的內容只會執行一次

awk -F, ‘print $1,$2,$3’ txt ——按逗號分隔成每個段 打印每個段

加逗號會輸出空格 以方便咱們觀察

awk -F, ‘print $1 $2 $3’ txt ——這樣的會打印出來的沒有逗號分隔 

也能夠不加逗號,加| 、 製表符等等,以下:

awk -F, ‘print $1」|」$2」|」$3’ txt

awk -F, ‘print $1」\t」$2 「\t」$3’ txt

awk -F, ‘/main/ print $1,$2,$3’ txt——匹配含有main的行

awk -F. '/txt/ {print $1 "\t" $2}' txt——以.做爲分隔符。。。

 

內置變量:

FS內置變量 表明分隔符 OFS表明輸出分隔符

awk 'BEGIN{FS=","; OFS="\t"; printf("===================\n")} {print $1,$2, $3} END{print("===================")}' txt

 

能夠指定多個分隔符,如 .  :  %三個

awk 'BEGIN{FS=[.:%]; OFS="\t"; printf("===================\n")} {print $1,$2, $3} END{print("===================")}' txt

 

指定分隔符並換行RS

文件內容:

101

lvy

BOSS

-

102

XXX

XXX

-

103

QQQ

QQQ

-

要求獲得格式如:

lvy:BOSS

XXX:XXX

QQQ:QQQ

答案:

 awk 'BEGIN{FS="\n"; OFS=":"; RS="-\n"} {print $2,$3} END{}' txt

 

輸出分隔符ORS

 awk 'BEGIN{FS="\n"; OFS=":"; RS="-\n"; ORS="\n----------\n"} {print $2,$3} END{}' txt

用在在每一行執行完畢後輸出一些內容。。。

lvy:BOSS

----------

XXX:XXX

----------

QQQ:QQQ

----------

awk中print與printf

print中不須要對變量進行處理,若是是字符串 加雙引號

printf與C語言中的用法是同樣的。

 

複習AWK:

 awk '{print $0}' txt ——打印txt中全部行

 awk 'BEGIN{OFS=":";RS="-\n"} {print $2,$3}' txt

 

默認的域分隔符是空格  域分隔符使用-F指定

sudo cat /etc/passwd | awk -F: '{print $1}' ——冒號做爲域分隔符

對比sudo cat /etc/passwd | awk '{print $1}'看看

 

統計/etc/passwd:文件名,每行的行號,每行的列數,對應的完整行內容:

awk  -F ':'  '{print "filename:" FILENAME ",linenumber:" NR ",columns:" NF ",linecontent:"$0}' /etc/passwd

awk 'BEGIN{print("Hello"); FS=".";} {print FILENAME, NR, $2} END{print("World!")}' txt

FILENAME表明文件名;NR表明行號;NF表明列數 $NF能夠取最後列

 

自定義變量:

必須以字符開始,不能使用內置變量,最好放在begin段中

awk  -f  xxx.awk  file ——  -f選項指定能夠在後面接一個awk腳本。

必須是下面這種形式 BEGIN{要放在一行

BEGIN{

   total=0;

}

{

   total += 1;

}

END{

   print 「total is :」, total;

}

 

一元運算符:+返回數字自己  - 改變數字的符號   ++遞增操做

算術運算符:+ - * /

字符串鏈接:str = str1」__」str2; 能夠鏈接

比較/邏輯運算符:>  >=  <  <=  &&  || 等

正則表達式:~匹配   !~不匹配

 

實例:統計/etc/passwd下有多少用戶使用/bin/bash

 cat /etc/passwd | awk -F: 'BEGIN{NUM=0;} /\/bin\/bash/ {print $NF; NUM++;} END{print "The number who use /bin/bash is:", NUM}'

 

AWK條件與循環:

與c語言同樣,awk中也有條件、循環語句

例子:awk -F, ‘{if ($3 == 500) print $1; else print 「Not Found!」;}’ /etc/passwd

 

 

 

第九節.shell環境

變量別名:shell中輸入alias ll=」ls -l」

若是想退出終端後還有效的話 就寫入~/.bashrc

 

stty -echo ——設置輸出不回顯 能夠再輸入密碼時,設置。

stty echo  ——回顯

 

cal ——查看日曆 

cal [[day][month]year]  [表明是可選的]  cal 7 2014表示查看2014年7月份

data ——查看時間

date 「+%A」 查看星期幾

date "+%Y-%m-%d %H:%M:%S" ——顯示2014-12-26 21:06:29

 

find命令補充:find [option] [-exec | -ok] command {} \;

-exec、-ok選項  -exec是不安全的,-ok是安全的

find /home -name test.txt -exec rm {} \; ——找到後會馬上刪除,不會提示

find . -name aaa -ok rm {} \; ——會提示是否刪除

find . -name aaa -exec cp {} /home \; 

 

-xargs選項 

find . -name aaa | xargs rm

find . -name aaa | xargs -i mv {} /opt

 

實例:查找當前目錄下非.c的文件 並進行刪除:

find . -type f ! -name *.c | xargs rm -f  ——注意感嘆號的位置

 

 

第十節.shell腳本編程

shell條件語句:

      if list then 
          do something here 
      elif list then 
          do another thing here 
      else 
         do something else here 
      fi    

EX1:

#!/bin/sh

SYSTEM=`uname -s`        #獲取操做系統類型

if [ $SYSTEM = "Linux" ] ; then     #若是是linux的話打印linux字符串 注意[]中兩邊的空格
echo "Linux" 
elif [ $SYSTEM = "FreeBSD" ] ; then   
echo "FreeBSD" 
elif [ $SYSTEM = "Solaris" ] ; then 
echo "Solaris" 
else 
echo "What?" 
fi     #ifend

基本上和其餘腳本語言同樣。沒有太大區別。不過值得注意的是。[]裏面的條件判斷。

1 字符串判斷

str1 = str2      當兩個串有相同內容、長度時爲真 
str1 != str2      當串str1和str2不等時爲真 
-n str1        當串的長度大於0時爲真(串非空) 
-z str1        當串的長度爲0時爲真(空串) 
str1           當串str1爲非空時爲真

2 數字的判斷

int1 -eq int2    兩數相等爲真 
int1 -ne int2    兩數不等爲真 
int1 -gt int2    int1大於int2爲真 
int1 -ge int2    int1大於等於int2爲真 
int1 -lt int2    int1小於int2爲真 
int1 -le int2    int1小於等於int2爲真

3 文件的判斷

-r file     用戶可讀爲真 
-w file     用戶可寫爲真 
-x file     用戶可執行爲真 
-f file     文件爲正規文件爲真 
-d file     文件爲目錄爲真 
-c file     文件爲字符特殊文件爲真 
-b file     文件爲塊特殊文件爲真 
-s file     文件大小非0時爲真 
-t file     當文件描述符(默認爲1)指定的設備爲終端時爲真

3 複雜邏輯判斷

-a         與 
-o        或 
!        非

 

一些預約義的變量:

linux中shell變量$#,$@,$0,$1,$2的含義解釋: 
$$    Shell自己的PID(ProcessID) 

$!    Shell最後運行的後臺Process的PID 
$?    最後運行的命令的結束代碼(返回值) 
$-    使用Set命令設定的Flag一覽 
$*    全部參數列表。如"$*"用「"」括起來的狀況、以"$1 $2 … $n"的形式輸出全部參數。 
$@   全部參數列表。如"$@"用「"」括起來的狀況、以"$1" "$2" … "$n" 的形式輸出全部參數。 
$#   添加到Shell的參數個數 
$0   Shell自己的文件名 
$1~$n  添加到Shell的各參數值。$1是第1參數、$2是第2參數…。 

 

補充:

    filename1 -nt filename2 若是 filename1 比 filename2 新,則爲真 [ /tmp/install/etc/services -nt /etc/services ]

 

    filename1 -ot filename2 若是 filename1 比 filename2 舊,則爲真 [ /boot/Image -ot arch/i386/boot/bzImage ]

 

 轉自:http://blog.csdn.net/scottly1/article/details/42197997

相關文章
相關標籤/搜索