shell基礎(上)

Shell基礎(上)

1.1什麼是shell

   Shell是一個命令解釋器,它在操做系統的最外層,負責直接與用戶對話,把用戶的html

輸入解釋給操做系統.井處理各類各樣的操做系統的輸出結果,輸出屏幕返回給用戶python

這種對話方式能夠是linux

  1. 交互的方式:從鍵盤輸入命令,經過/bin/bash的解折,能夠當即獲得shell的迴應redis

  2. 非交互的方式:腳本shell

 Shell執行命令分爲兩種方式編程

  1. 內置命令:如講過的cd ,pwd, exitecho等命令.當用戶登陸系統後,shell以及內置命令就被系統載入到內存,而且一直運行vim

  2. 通常命令:15,磁盤上的程序文件==>調入內存==>執行命令bash

 

1.2什麼是shell腳本

linux命令或語句不在命令行下執行(嚴格說,命令行也是Shell,而是經過一個程序文件執行時,該程序就被稱爲Shell腳本或Shell程序less

 

  用戶能夠在Shell腳本中敲入一系列的命令及命令語句組合。這些命令、變量和流程控制語句等有機的結合起來就造成一個功能強大的Shell腳本。運維

 

1.2.1 寫一個清空/var/log/messages日誌的腳本

  1. 日誌文件在哪?

  2. 用什麼命令能夠清空文件

  3. 寫一個簡單的shell腳本。

  4. 怎樣執行腳本?

  5. 進階:

有沒有考慮到

1)有沒有腳本放在統一的目錄

2)權限:用哪一個用戶執行文件

3)清空錯文件怎麼辦,該怎麼辦

4)錯誤提示:有沒有成功知不知道

5)腳本通用性

 

[root@ccdata]# mkdir -p /server/scripts

[root@ccdata]# cd /server/scripts

[root@ccscripts]# vim clear_log.sh

#!/bin/bash

cd /var/log/

>messages

~

[root@ccscripts]# cat clear_log.sh

#!/bin/bash

cd /var/log/

>messages

[root@ccscripts]# sh clear_log.sh

[root@ccscripts]# cat /var/log/messages  #空的清空了

 

1.2.2 一個規範的Shell腳本

[root@cc~ ]#mkdir -p/server/scripts    #要有規範的存放腳本目錄

[root@cc ~]# cd/server/scripts/

[root@ cc scripts]# vim clear_log.sh

#!/bin/bash

LOG_DIR=/var/log

ROOT_UID=O   #UID爲0時,用戶才具備root權限echo $UID

#要使用root用戶執行

if[ "$UID" -ne "$ROOT _UID" ]

then

  echo"Must be root to run this script."

  exit 1

  fi

#||表示前面執行失敗則執行後面,區別於&&

cd $ LOG_DIR 2>/dev/null || {

    echo"Cannot change to necessary directory.」

    exit 1

}

cat /dev/null>messages && echo"Logs cleaned up."

exit 0

#退出以前返回0表示成功,返回1表示失敗。

 

1.2.3清空日誌的三種方法

echo >test.log

>test.log

cat /dev /null >test.log

#清空內容。保留文件

1.2.4小結

Shell就是命令解釋器.==>翻譯官

Shell腳本==>命令放在腳本里

 

1.3Shell腳本在運維工做中的做用地位

Shell腳本擅長處理純文本類型的數據,而linux中幾乎全部的配置文件、日誌文件等都是純文本類型文件

第2章 腳本的創建和執行

2.1Shell腳本的創建

推薦使用vim編輯器

2.1.1腳本開頭

    規範的Shell腳本第一行會指出由哪一個程序(解釋器)來執行腳本中的內容。在linux bash編程中通常爲,

#!/bin/bash

#!/bin/sh<==255個字符之內

其中開頭的「#!」又稱爲幻數,在執行Shell腳本的時候,內核會根據「#!」後的解釋器來肯定用0個程序解釋腳本中的內容。

注意:這一行必須在每一個腳本頂端的第一行,若是不是第一行則爲腳本註釋行

 

2.1.2bash版本

[root@cc~]# bash --version

GNU bash, version 4.1.2(1)-release(x86_64-redhat-linux-gnu)

Copyright (C) 2009 Free Software Foundation, Inc.

License GPLv3+: GNU GPL version 3 or later<http://gnu.org/licenses/gpl.html>

 

This is free software; you are free to change andredistribute it.

There is NO WARRANTY, to the extent permitted bylaw.

2.1.3bash漏洞(破殼漏洞)

1.4 bash漏洞(破殼漏洞)

若是是比較老的系統,須要注意shell的版本過低,有漏洞,須要升級shell

#驗證方法

[root@cc~]# env x='() { :;}; echo be careful' bash -c "echo this is a test"

this is a test

若是返回2行

be careful 就是有漏洞須要升級

#升級方法  yum -y update bash

 

2.1.4 不一樣語言腳本的開頭寫法

#!/bin/bash

#!/usr/bin/awk

#!/bin/sed

#!/usr/bin/tcl

#!/usr/bin/per

#!/usr/bin/env python

    若是腳本開頭不指定解釋雄,就要用對應的解釋器執行腳本。例如bash  test.hpython  test.py

 

2.1.5 腳本註釋

    Shell腳本中,跟在#後面的內容表示註釋。註釋部分不會被執行,僅給人看。註釋能夠自成一行,也能夠跟在命令後面,與命令同行。要養成寫註釋的習慣,方便本身與他人。

最好不用中文註釋,由於在不一樣字符集的系統會出現亂碼

 

2.2腳本的執行

2.2.1Shell腳本執行的四種方式

  1. 1.     bash script-name sh script-name(推薦使用)

這種方法是當腳本自己沒有可執行權限時常使用的方法

 

 

  1. path/script-name./script-name(全路徑或當前路徑執行腳本)

這種方法首先須要給腳本文件可執行權限。

  1. source script-name. script-name注意點號,且點號後有空格。

  2. sh<script-namecat script-name |shcat script-name |bash

  3. 3shell腳本開發的規範和習慣

  4. 開頭指定腳本解釋器。

  5. 開頭加版本版權等信息,可配置~/.vimrc文件自動添加。

  6. 腳本不要用中文註釋,儘可能用英文註釋

  7. 腳本以.sh爲擴展名。

  8. 放在統一的目錄

  9. 代碼書寫優秀習慣

a.       成對的內容一次性寫出來,防止遺漏,如[ ]' '" "

b.      []兩端要有空格,先輸入[],退格,輸入2個空格,再退格寫。

c.       流程控制語句一次書寫完,再添加內容。

if條件

 then

內容

fi

d.      經過縮進讓代碼易讀。

e.       腳本中的引號都是英文狀態下的引號,其餘字符也是英文狀態。

好的習慣可讓咱們避免不少沒必要要的麻煩,提升工做效率

 

第3章 Shell環境變量

3.1什麼是環境變量

變量就是用一個固定的字符串(也多是字符數字等的組合),替代更多史複雜的內這個內容裏可能還會包含變量和路徑,字符串等其餘內容。變量的定義是存在內存容中。

 

3.2變量類型

變量分爲兩類:

環境變量(也可稱爲全局變量) :能夠在建立他們的Shell及其派生出來的子Shell中使用。環境變量又能夠分爲自定義環境變量和bash內置的環境變量。

局部變量(普通變量):只能在建立他們的Shell函數或shell腳本中使用,還記得前而的$user?咱們建立的通常都是普通變量。

 

3.3環境變量

    環攪變量用於定義Shell的運行環境,保證Shell命令的正確執行,Shell經過環境變量來肯定登陸用戶名、命令路徑、終端類型、登陸目錄等,全部的環境變量都是全局變量,可用於全部子進程中,包括編輯器、shell腳本和各種應用。但crond計劃任務除外,還須要從新定義環境變量。

    環倍變量能夠在命令行中設置,但用戶退出時這些變量值也會丟失,所以最好在用戶家目錄下的bash_profile文件中或全局配$/etc/bashrc, /etc/profile文件或者/etc/profile.d/目錄中定義。將環境變量放入profile文件中,每次用戶登陸時這些變量值都將被初始化。

    一般,全部環境變量都爲大寫。環境變量應用於用戶進程前,都應該用export命令導出。例如-exportOLDBOV=1

有一些環境變量,好比HOME, PATH, SHELL, UID,USER等,在用戶登陸以前就已經被/bin/loein程序設置好了。一般環境變量定義並保存在用戶家目錄下的.bash profile/etc/profile 文件中。

 

3.3.1查看系統環境變量

[root@cc ~]# echo $HOME

/root

[root@cc ~]# echo $PATH

/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin

[root@cc ~]# echo $SHELL

/bin/bash

[root@cc ~]# echo $UID

0

[root@cc ~]# echo $USER

root

[root@cc~]# env查看系統環境變量

HOSTNAME=cc

TERM=xterm

SHELL=/bin/bash

HISTSIZE=1000

SSH_CLIENT=192.168.106.1 49474 22

SSH_TTY=/dev/pts/0

USER=root

LS_COLORS=rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:mi=01;05;37;41:su=37;41:sg=30;43:ca=30;41:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arj=01;31:*.taz=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.dz=01;31:*.gz=01;31:*.lz=01;31:*.xz=01;31:*.bz2=01;31:*.tbz=01;31:*.tbz2=01;31:*.bz=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.rar=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.jpg=01;35:*.jpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.axv=01;35:*.anx=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=01;36:*.au=01;36:*.flac=01;36:*.mid=01;36:*.midi=01;36:*.mka=01;36:*.mp3=01;36:*.mpc=01;36:*.ogg=01;36:*.ra=01;36:*.wav=01;36:*.axa=01;36:*.oga=01;36:*.spx=01;36:*.xspf=01;36:

MAIL=/var/spool/mail/root

PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin

PWD=/root

LANG=en_US.UTF-8

HISTCONTROL=ignoredups

SHLVL=1

HOME=/root

LOGNAME=root

CVS_RSH=ssh

SSH_CONNECTION=192.168.106.1 49474 192.168.106.13222

LESSOPEN=||/usr/bin/lesspipe.sh %s

G_BROKEN_FILENAMES=1

_=/bin/env

 

3.3.2當前終端變量

[root@cc~]# echo $PS1

[\u@\h \W]\$

 

3.4Shell局部變量

3.4.1定義局部變量

    局部變量在用戶當前的shell生存期的腳本中使用。例如,局部變量OLDBOy取值爲ett098,這個值只在用戶當前shell生存期中有意義。若是在shell中啓動另外一個進程或退出,局部變量OLDBOY值將無效。

 

3.4.1.1 普通字符串定義變量

變量名=value

變量='value '

變量名="value"

3.4.1.2  shell中變量名及變量內容的要求

    通常是字母、數字、下劃線組成,且以字母開頭。如oldboy,oldboy123,

oldboy_training。變量的內容,可使用單引號或雙引號引發來,或不加引號。

 

[root@cc ~]#a=192.168.1.2

[root@cc ~]# echo"a=$a"

a=192.168.1.2

[root@cc ~]#b='192.168.1.2'

[root@cc ~]#c="192.168.1.2"

[root@cc ~]# echo"b=$b"

b=192.168.1.2

[root@cc ~]# echo"c=$c"

c=192.168.1.2

3.4.1.3 把一個命令做爲變量

[root@cc ~]# DATE=`date +%F`

[root@cc ~]# echo $DATE

2017-02-17

3.4.1.4 小結

  1. CMD=`ls`ls兩側的符號是鍵盤tab鍵上面的,不是單引號

  2. 在變量名前加$,能夠取得此變量的值,使用echoprintf命令能夠顯示變量的值,$A${A}寫法不一樣,效果同樣,推薦後面的寫法

  3. ${WEEK}DAY若變量和其餘字符組成新的變量就必須給變量加上大括號{}

  4. 養成將全部字符串變量用雙引號括起來使用的習慣,減小編程遇到的怪異錯誤。"$A""${A}"

  5. 4.2變量名及變量內容定義小結

  6. 變量名只能由字母、數字、下劃線組成,且以字母開頭。

  7. 規範的變量名寫法定義:見名知意

1)OldboyAge=1 <==每一個單詞首字母大寫

2)oldboy_age=1<==每一個單詞之間用「_

3oldboyAgeSex=1 <==駝峯語法: 首個單詞字母小寫,其他單詞首字母大寫

3.  =號的知識,a=1中的等號是賦值的意思,比較是否是和等爲"=="

4.  打印變量,變量名前接$符號,變量名後緊接字符的時候,要用大括號括起來

  1. 注意變量內容引用方法,通常爲雙引號,簡單連續字符能夠不加引號,但願原樣輸出,使用單引號。

  2. 變裏內容是命令要用反引號` `或者$( )把變量括起來使用。

第4章 Shell特殊變量

4.1位置變量

$0 獲取當前執行的shell腳本的文件名,若是執行腳本帶路徑那麼就包括腳本路徑。

 

$n 獲取當前執行的shell腳本的第n個參數值,n=1..9,當n0時表示腳本的文件名,若是n大於9用大括號括起來{10},參數以空格隔開。

 

$# 獲取當前執行的shell腳本後面接的參數的總個數

 

4.1.1$0 獲取當前執行的shell腳本的文件名,包括路徑

[root@cc scripts]# vim teshu.sh

[root@cc scripts]# cat teshu.sh

#! /bin/bash

echo $0

[root@ccscripts]# sh teshu.sh

teshu.sh

[root@ccscripts]# sh /server/scripts/teshu.sh

/server/scripts/teshu.sh

 

4.1.2$n獲取當前執行的shell腳本的第n個參數值

[root@cc scripts]# cat teshu.sh

#! /bin/bash

echo $0

echo$1 $2 $3 $4 $5 $6 $7 $8 $9 $10 $11 $12 $13 $14 $15   #寫法是錯誤的

 

[root@cc scripts]# sh teshu.sh

teshu.sh

0 1 2 3 4 5  #顯示的是標爲紅色的部分

[root@cc scripts]# cat teshu.sh

#! /bin/bash

echo $0

echo$1 $2 $3 $4 $5 $6 $7 $8 $9 ${10} ${11} ${12} ${13} ${14} ${15}    #正確的寫法

 

[root@ccscripts]# sh teshu.sh  a b c

teshu.sh

a b c

 

4.1.3$#獲取當前執行的shell腳本後面接的參數的總個數

[root@cc scripts]# cat teshu.sh

#! /bin/bash

echo $0

echo $1 $2 $3 $4 $5 $6 $7 $8 $9 ${10} ${11} ${12}${13} ${14} ${15}

echo $#

[root@ccscripts]# sh teshu.sh  {a..z}

teshu.sh

a b c d e f g h i j k l m n o

26

4.2進程狀態變量

$? 獲取執行行上一個指令的返回值(0爲成功,非0爲失敗)

查找方法man bash,而後搜索 Special Parameters

 

4.2.1$?

[root@cc ~]# cd qqq

-bash: cd: qqq: No such file or directory

[root@cc ~]# echo $?

127

[root@cc ~]# pwd

/root

[root@cc ~]# echo $?

0

$?返回值參考

0表示運行成功

2權限拒絕

1~125 表示運行失敗,腳本命令、系統命令錯誤或參數傳遞錯誤。

126找到該命令,但沒法執行

127未找到要運行的命令

>128命令被系統強制結束

 

 

生產環境

  1. 用於判斷命令、腳本或函數等程序是否執行成功

  2. 若在腳本中調用執行「exit數字」,則會返回這個數字給「$?」變量。

  3. 若是在函數中使用「return數字」,則會以函數返回值的形式傳給「$? "

[root@cc scripts]# cat teshu.sh

#! /bin/bash

echo $0

echo $1 $2 $3 $4 $5 $6 $7 $8 $9 ${10} ${11} ${12}${13} ${14} ${15}

echo $#

if[ $1 == 1 ]

  then

    exit 22

else

    exit 33

fi

[root@ccscripts]# sh teshu.sh  1

teshu.sh

1

1

[root@ccscripts]# echo $?

22

[root@ccscripts]# sh teshu.sh  2

teshu.sh

2

1

[root@ccscripts]# echo $?

33

 

第5章 變量的數值計算

5.1(())用法(經常使用於簡單的整數運算)

算術運算符號

運算符

意義

++   --

增長及減小,可前置也可放在結尾

+ - ! ~

一元的正號與負號,非,邏輯與位的取反

* /  %

乘法 除法  取餘

+ -

加法 減法

< <= > >=

比較符號

==   !=

相等 不相等

&

向左位移 向右位移

^

位的AND

|

位的異或

&&

位的或

||

位的OR

?:

條件表達式

= +=   -=

賦值運算符

**

冪運算

[root@cc scripts]# a=$((2-1))

[root@cc scripts]# echo $a

1

[root@cc scripts]# a=$((a++))

[root@cc scripts]# echo $a

1

[root@ccscripts]# a=$((a++))

[root@cc scripts]# echo $a

1

[root@ccscripts]# a=$((++a))

[root@cc scripts]# echo $a

2

[root@cc scripts]# echo $a

2

[root@ccscripts]# a=$((++a))

[root@cc scripts]# echo $a

3

變量a在前,表達式的值爲a,而後a自增或自減,變量a在符號後,表達式值自增或自減,而後a值自增或自減。

[root@cc scripts]# cat calculator.sh

#!/bin/sh

echo $(($1))

[root@cc scripts]# sh calculator.sh 3+2-2*2/1

1

 

5.2$[]的用法

[root@cc scripts]# echo $[1+1]

2

[root@cc scripts]# echo $[1*3]

3

 

第6章 腳本中定義變量

6.1腳本直接賦值

[root@cc scripts]# cat calculator.sh

#!/bin/sh

echo $(($1))

a=6

b=2

6.2命令行傳參

利用位置變量

[root@cc scripts]# cat calculator.sh

#!/bin/sh

echo $(($1))

a=$6  

b=$2

 

第7章 條件測試

判斷某些條件是否成立,成立執行一種命令,不成立執行另一種命令。

7.1條件測試語法

格式:[ 測試表達式 ]

7.2測試表達式

方法一

[root@ccscripts]# [ -f /etc/hosts ]

[root@cc scripts]# echo $?

0

[root@ccscripts]# [ -f /etc/host ]

[root@cc scripts]# echo $?

1

方法二

[root@ccscripts]# [ -f /etc/hosts ]&&echo TRUE||echo FALSE

TRUE

[root@ccscripts]# [ -f /etc/host ]&&echo TRUE||echo FALSE

FALSE

 

7.2.1經常使用的文件測試操做符號

經常使用文件測試操做符號

說明

-f文件, file

文件存在且爲普通文件則真,即測試表達式成立

-d文件, directory

文件存在且爲目錄文件則真,即測試表達式成立

-s文件,  size

文件存在且文件大小不爲0則真,即測試表達式成立

-e文件,  exist

文件存在則真,即測試表達式成立。只要有文件就行,區別-f

-r文件,  read

文件存在且可讀則真,即測試表達式成立

-w文件,write

文件存在且可寫則真,即測試表達式成立

-x文件,executable

文件存在且可執行則真,即測試表達式成立

-L文件,link

文件存在且爲連接文件則真,即測試表達式成立

f1 -nt f2  newer than

文件f1f2新則真,即測試表達式成立,根據文件修改時間計算

f1 -ot f2 older than

文件f1f2舊則真,即測試表達式成立,根據文件修改時間計算

 

7.2.2字符串測試操做符

字符串測試操做符的做用:比較兩個字符串是否相同、字符串長度是否爲零,字符串是否爲NULLBash區分零長度字符串和空字符串。

經常使用字符串測試操做符

說明

-z "字符串"

若串長度爲0則真,-z理解爲zero

-n "字符串"

若串長度不爲0則真,-n理解爲no zero

"1"  =  "2"

若串1等於串2則真,可使用「==」代替「=」

"1"  !=  "2"

若串1不等於串2則真,但不能使用==」代替

特別注意,以上表格中的字符串測試操做符號務必要用""引發來。[ -z  "$string" ]

字符串比較,比較符號兩端最好有空格,參照系統腳本。

[  "$passwd"    =   "john ]

[root@ccscripts]# [ -z " " ]&&echo TRUE||echo FALSE

FALSE

[root@ccscripts]# [ -z "" ]&&echo TRUE||echo FALSE

TRUE

[root@cc scripts]# [ -n "" ]&&echo TRUE||echo FALSE

FALSE

[root@ccscripts]# [ "aa" == "bb" ]&&echo TRUE||echo FALSE

FALSE

[root@cc scripts]# [ "aa" != "bb" ]&&echoTRUE||echo FALSE

TRUE

 

7.2.3整數二元比較操做符

[]中使用的比較符

說明

-eq

equal等於

-ne

not equal不等於

-gt

greater than大於

-ge

greater equal大於等於

-lt

less than小於

-le

less equal小於等於

[root@cc scripts]# [ 1 -le 2 ]&&echoTRUE||echo FALSE

TRUE

[root@cc scripts]# [ 1 -ne 2 ]&&echoTRUE||echo FALSE

TRUE

[root@cc scripts]# [ 1 -eq 2 ]&&echoTRUE||echo FALSE

FALSE

[root@cc scripts]# [ 1 -lt 2 ]&&echoTRUE||echo FALSE

TRUE

[root@cc scripts]# [ 1 -gt 2 ]&&echoTRUE||echo FALSE

FALSE

7.2.4邏輯操做符

[]中使用的邏輯操做符

說明

-a

and,兩端都爲真則真

-o

or,有一個真則真

not,相反則真

[root@cc scripts]# [ "1" !="2" -a 1 -eq 2 ]&&echo TRUE||echo FALSE

FALSE

[root@cc scripts]# [ "1" !="2" -o 1 -eq 2 ]&&echo TRUE||echo FALSE

TRUE

 

7.2.5小結

  1. 多個[]之間的邏輯操做符是&&||

  2. 2.     &&前面成功執行後面

  3. 3.     || 前面不成功執行後面

相關文章
相關標籤/搜索