Linux shell介紹 及克隆配置

介紹shell

Shell自己是一個用C語言編寫的程序,它是用戶使用Unix/Linux的橋樑,用戶的大部分工做都是經過Shell完成的。Shell既是一種命令語言,又是一種程序設計語言。做爲命令語言,它交互式地解釋和執行用戶輸入的命令;做爲程序設計語言,它定義了各類變量和參數,並提供了許多在高級語言中才具備的控制結構,包括循環和分支。java

  它雖然不是Unix/Linux系統內核的一部分,但它調用了系統核心的大部分功能來執行程序、創建文件並以並行的方式協調各個程序的運行。所以,對於用戶來講,shell是最重要的實用程序,深刻了解和熟練掌握shell的特性極其使用方法,是用好Unix/Linux系統的關鍵。linux

Shell有兩種執行命令的方式:正則表達式

  交互式(Interactive):解釋執行用戶的命令,用戶輸入一條命令,Shell就解釋執行一條。shell

  批處理(Batch):用戶事先寫一個Shell腳本(Script),其中有不少條命令,讓Shell一次把這些命令執行完,而沒必要一條一條地敲命令。編程

ps:shell有另一種解釋,就是shell 是外殼,能夠經過人與Linux之間的一種交互windows

  Unix/Linux上常見的Shell腳本解釋器有bash、sh、csh、ksh等,習慣上把它們稱做一種Shell。咱們常說有多少種Shell,其實說的是Shell腳本解釋器。api

  bash:bash是Linux標準默認的shell。bash由Brian Fox和Chet Ramey共同完成,是BourneAgain Shell的縮寫,內部命令一共有40個。數組

  Linux使用它做爲默認的shell是由於它有諸如如下的特點:bash

可使用相似DOS下面的doskey的功能,用方向鍵查閱和快速輸入並修改命令。服務器

自動經過查找匹配的方式給出以某字符串開頭的命令。

包含了自身的幫助功能,你只要在提示符下面鍵入help就能夠獲得相關的幫助。

  sh:sh 由Steve Bourne開發,是Bourne Shell的縮寫,sh 是Unix 標準默認的shell。

  ash:ash shell 是由Kenneth Almquist編寫的,Linux中佔用系統資源最少的一個小shell,它只包含24個內部命令,於是使用起來很不方便。

  csh:csh 是Linux比較大的內核,它由以William Joy爲表明的共計47位做者編成,共有52個內部命令。該shell實際上是指向/bin/tcsh這樣的一個shell,也就是說,csh其實就是tcsh。

  ksh:ksh 是Korn shell的縮寫,由Eric Gisin編寫,共有42條內部命令。該shell最大的優勢是幾乎和商業發行版的ksh徹底兼容,這樣就能夠在不用花錢購買商業版本的狀況下嘗試商業版本的性能了。

ps:bash是 Bourne Again Shell 的縮寫,是linux標準的默認shell ,它基於Bourne shell,吸取了C shell和Korn shell的一些特性。bash徹底兼容sh,也就是說,用sh寫的腳本能夠不加修改的在bash中執行

建立第一個shell腳本:

mkdir shell

cd shell

vi first.sh --> sh表明shell腳本,不加也行

#!/bin/sh等價於#!/bin/bash 

#!/bin/bash  告訴系統該腳本用什麼解釋器執行

echo "Hello Shell"  輸入出語句

 

執行當前文件發現執行不了,是由於缺乏權限,因此

chmod a+x first.sh  #使腳本具備執行權限

./first.sh  #執行腳本

 

加解釋器運行:

/bin/bash ./first.sh

sh ./first.sh

不用賦予腳本執行權限;

不用再腳本第一行加#!/bin/bash,也是外面的生效

 

Shell變量:

一、變量定義

定義變量時,變量名不加美圓符號$如:

name=1705

注意:

變量名和等號之間不能有空格

變量名不能以數字、特殊符號開頭、bash關鍵字,可使用_開頭

#!/bin/bash 

name=1705 定義變量

 

二、變量取值

兩種方式第一種:

#!/bin/bash 

name=1705 定義變量

echo $name 打印變量 $變量

 

第二種肯定變量的界限:

#!/bin/bash 

name=1705 定義變量

name=bd1705 從新複製

echo ${name}qianfen 在打印變量的後添加字符串,不能使用+

                                  可使用」qianfeng」 最經常使用的方法變量界限${name}qianfen

這裏{}這個方式是可選方式,須要識別界限的時候就能夠添加

 

三、變量賦值

第一種:直接賦值

#!/bin/bash 

name=1705

name=bd1705

echo $name

 

第二種:expr命令

能夠將四則運算的結果賦值給變量

須要注意:

  1. 須要使用~鍵的`包裹expr命令`(不是單引號,是倒引符號)
  2. expr命令後面必須有空格,值於運算符之間也必須有空格

#!/bin/bash

name=`expr 2 + 2`

echo $name

 

四、只讀變量

使用 readonly 命令能夠將變量定義爲只讀變量,只讀變量的值不能被改變。

下面的例子嘗試更改只讀變量,結果報錯:

#!/bin/bash

name=1705

readonly name

name=1708

運行腳本,結果以下:

./readonly: line 4: name: readonly variable。

 

五、刪除變量

使用 unset 命令能夠刪除變量。語法:

unset variable_name

變量被刪除後不能再次使用。unset 命令不能刪除只讀變量。

實例

#!/bin/bash

name=1705

readonly name

age=17

unset age

echo $age

以上實例執行將沒有任何輸出。

 

六、變量類型:(局部變量(經常使用)、環境變量(系統變量)、shell變量)

運行shell時,會同時存在三種變量:

1) 局部變量 局部變量在腳本或命令中定義,僅在當前shell實例中有效,

其餘shell啓動的程序不能訪問局部變量。

2) 環境變量(系統變量) 全部的程序,包括shell啓動的程序,都能訪問環境變量,

有些程序須要環境變量來保證其正常運行。必要的時候shell腳本也能夠定義環境變量。

set能夠查看全部的系統變量

echo $JAVA_HOME

 

會添臨時存儲到環境變量中重啓或關閉就會消失,也能夠經過unset name 撤銷這變量(能夠不講)

3) shell變量 shell變量是由shell程序設置的特殊變量。

shell變量中有一部分是環境變量,有一部分是局部變量,這些變量保證了shell的正常運行

 

七、shell變量的類型:

Shell變量中的類型比較簡單:只有字符串類型,字符串能夠用單引號,也能夠用雙引號,反引號。

' ':單引號中的原樣輸出,不識別變量、轉義符等

" ":雙引號識別變量和轉義符等

` `:裏面是命令

 

Ps:如果一個整數,那麼在不進行運算的狀況下便可以當作一個字符串也能夠看作一個整數

   在計算的狀況下是一個整數

#!/bin/bash

a=1  這便可看作字符串也能夠看作是整數

b=2

c=」I LOVE U」 只有添加單/雙引號才能給字符串添加空格

echo `expr $a + $b` 一旦運算 a 和 b 中存儲的是整數

echo ‘`expr $a + $b`’

echo 「`expr $a + $b`」

 

拼接字符串

your_name="haha"

greeting="hello, $your_name !"

echo $greeting

 

獲取字符串長度

string="abcdef"

echo ${#string}   

輸出 6

 

提取子字符串

如下實例從字符串第 2 個字符開始截取 4 個字符:

string="this is 1511A class"

echo ${string:0:4}

 輸出 this

 

查找子字符串

查找字符 "i 或 s" 的位置:

string="this is 1511A class"

echo `expr index "$string" is` 

 輸出 3  (注意""不能去掉)

 

ps:特殊變量

$?:表示上一個命令退出的狀態 0表明正常退出

$$:表示當前進程編號

$0:表示當前腳本名稱

$n:表示n位置的輸入參數(n表明數字,n>=1)

#!/bin/bash

echo 「第一個參數:=」$1

echo 「第一個參數:=」$2

./firstfile.sh hello world

 

 

 

Shell數組:

bash支持一維數組(不支持多維數組),而且沒有限定數組的大小。

相似與C語言,數組元素的下標由0開始編號。

獲取數組中的元素要利用下標,下標能夠是整數或算術表達式,其值應大於或等於0。

 

一、定義數組

在Shell中,用括號來表示數組,數組元素用"空格"符號分割開。定義數組的通常形式爲:

數組名=(值1 值2 ... 值n)

例如:

array_name=(value0 value1 value2 value3)

或者

array_name=(

value0

value1

value2

value3

)

還能夠單獨定義數組的各個份量:

array_name[0]=value0

array_name[1]=value1

array_name[n]=valuen

能夠不使用連續的下標,並且下標的範圍沒有限制。

 

二、讀取數組(沒有也不會報數組越界異常,就是查詢不出來)

讀取數組元素值的通常格式是:

${數組名[下標]}

例如:

valuen=${array_name[n]}

使用@或者*符號能夠獲取數組中的全部元素,例如:

echo ${array_name[@]}

 

三、獲取數組的長度

獲取數組長度的方法與獲取字符串長度的方法相同,例如:

# 取得數組元素的個數

length=${#array_name[@]}

# 或者

length=${#array_name[*]}

 

四、取得數組單個元素的長度

lengthn=${#array_name[n]}

 

五、數組循環遍歷

 

 

Shell 基本運算符和條件控制

以"#"開頭的行就是註釋,會被解釋器忽略。(除第一行的解釋器之外)

sh裏沒有多行註釋,只能每一行加一個#號。

注:

若是在開發過程當中,遇到大段的代碼須要臨時註釋起來,過一下子又取消註釋,怎麼辦呢?

每一行加個#符號太費力了,能夠把這一段要註釋的代碼用一對花括號括起來,定義成一個函數,沒有地方調用這個函數,這塊代碼就不會執行,達到了和註釋同樣的效果。

 

Shell 和其餘編程語言同樣,支持多種運算符,包括:

算數運算符 + - * / % =

原生bash不支持簡單的數學運算,可是能夠經過其餘命令來實現expr 最經常使用。

expr 是一款表達式計算工具,使用它能完成表達式的求值操做。

例如,兩個數相加(注意使用的是反引號 ` 而不是單引號 '):

#!/bin/bash

val=`expr 3 + 3`

echo "兩數之和爲 : $val"

執行腳本,輸出結果以下所示:

兩數之和爲 : 6

Ps:表達式和運算符之間要有空格,例如 2+2 是不對的,必須寫成 2 + 2,這與咱們熟悉的大多數編程語言不同。

完整的表達式要被 ` ` 包含,注意這個字符不是經常使用的單引號,在 Esc 鍵下邊。

下表列出了經常使用的算術運算符,假定變量 a 爲 10,變量 b 爲 20:

運算符     說明         舉例

+       加法         `expr $a + $b` 結果爲 30。

-        減法         `expr $a - $b` 結果爲 10。

*       乘法         `expr $a \* $b` 結果爲  200。 須要注意的是* 須要轉義一下

/        除法         `expr $b / $a` 結果爲 2。

%      取餘         `expr $b % $a` 結果爲 0。

=       賦值         a=$b 將把變量 b 的值賦給 a

 

關係運算符

關係運算符只支持數字,不支持字符串,除非字符串的值是數字。

下表列出了經常使用的關係運算符,假定變量 a 爲 10,變量 b 爲 20:

運算符                                說明                                                                        舉例

-eq (==)    檢測兩個數是否相等,相等返回 true。                               [ $a -eq $b ] 返回 false。

-ne (!=)     檢測兩個數是否不相等,不相等返回 true。                      [ $a -ne $b ] 返回 true。

-gt(>)         檢測左邊的數是否大於右邊的,若是是,則返回 true。[ $a -gt $b ] 返回 false。

-lt(<)          檢測左邊的數是否小於右邊的,若是是,則返回 true。[ $a -lt $b ] 返回 true。

-ge(>=)      檢測左邊的數是否大等於右邊的,若是是,則返回 true。[ $a -ge $b ] 返回 false。

-le(<=)       檢測左邊的數是否小於等於右邊的,若是是,則返回 true。[ $a -le $b ] 返回 true。

 

單一的if:(表達式必須有空格)

if  [條件表達式是] --> [ $a -eq $b ]

then

執行的語句

fi

寫成一句版本:if [ ] ; then echo "" ;fi

 

if else :(表達式必須有空格,else後不能有then)

If  [條件表達式式] --> [ $a -eq $b ]

then

執行語句1

else

執行語句2

fi

 

if else-if else :(elif後必須有then)

if  [條件表達式式] --> [ $a -eq $b ]

then

   執行語句1

elif [條件表達式式] --> [ $a -eq $b ]

then

    執行語句2

else

    執行語句3

fi

#!/bin/bash

a=10

b=10

if [ $a -eq $b ]

then

   echo "$a -eq $b: a 等於 b"

Fi

 

a=10

b=20

if [ $a -ne $b ]

then

   echo "$a -ne $b: a 不等於 b"

Fi

 

 

a=10

b=20

if [ $a -gt $b ]

then

   echo "$a -gt $b: a 大於 b"

else

   echo "$a -gt $b: a 小於 b"

fi

 

 

if [ $a -lt $b ]

then

   echo "$a -lt $b: a 小於 b"

elif [ $a -ge $b ]

then

   echo "$a -lt $b: a 大於等於 b"

elif [ $a -le $b ]

then

   echo "$a -le $b: a 小於等於 b"

else

   echo 「都不對」

fi

 

布爾和邏輯運算符

布爾運算符                                說明                                                                                 舉例

!        非運算,表達式爲 true 則返回 false,不然返回 true。        [ ! false ] 返回 true。

-o      或運算,有一個表達式爲 true 則返回 true。          [ $a -lt 20 -o $b -gt 100 ] 返回 true。

-a      與運算,兩個表達式都爲 true 才返回 true。          [ $a -lt 20 -a $b -gt 100 ] 返回 false。

#!/bin/bash

a=10

b=20

if [ ! $a -lt $b ]

then

   echo "正常結果"

else

   echo "取!後的結果"

fi

if [ $a -lt 100 -a $b -gt 15 ]

then

   echo "$a -lt 100 -a $b -gt 15 : 返回 true"

else

   echo "$a -lt 100 -a $b -gt 15 : 返回 false"

fi

if [ $a -lt 100 -o $b -gt 100 ]

then

   echo "$a -lt 100 -o $b -gt 100 : 返回 true"

else

   echo "$a -lt 100 -o $b -gt 100 : 返回 false"

fi

 

邏輯運算符

&&   邏輯的 AND                               [[ $a -lt 100 && $b -gt 100 ]] 返回 false

||     邏輯的 OR                                                                     [[ $a -lt 100 || $b -gt 100 ]] 返回 true

#!/bin/bash

a=10

b=20

if [[ $a -lt 100 && $b -gt 100 ]]

then

   echo "返回 true"

else

   echo "返回 false"

fi

if [[ $a -lt 100 || $b -gt 100 ]]

then

   echo "返回 true"

else

   echo "返回 false"

fi

 

 

字符串運算符

下表列出了經常使用的字符串運算符,假定變量 a 爲 "abc",變量 b 爲 "efg":

運算符     說明         舉例

=       檢測兩個字符串是否相等,相等返回 true。             [ $a = $b ] 返回 false。

!=     檢測兩個字符串是否不相等,不相等返回 true。    [ $a != $b ] 返回 true。

-z      檢測字符串長度是否爲0,爲0返回 true。              [ -z $a ] 返回 false。

-n      檢測字符串長度是否不爲0,不爲0返回 true。              [ -n $a ] 返回 true。

str    檢測字符串是否爲空,不爲空返回 true。                 [ $a ] 返回 true。

Ps:獲取字符串的長度${#變量名}

 

實例

字符串運算符實例以下:

#!/bin/bash

 

a="abc"

b="efg"

 

if [ $a = $b ]

then

   echo "$a = $b : a 等於 b"

else

   echo "$a = $b: a 不等於 b"

fi

if [ $a != $b ]

then

   echo "$a != $b : a 不等於 b"

else

   echo "$a != $b: a 等於 b"

fi

if [ -z $a ]

then

   echo "-z $a : 字符串長度爲 0"

else

   echo "-z $a : 字符串長度不爲 0"

fi

if [ -n $a ]

then

   echo "-n $a : 字符串長度不爲 0"

else

   echo "-n $a : 字符串長度爲 0"

fi

if [ $a ]

then

   echo "$a : 字符串不爲空"

else

   echo "$a : 字符串爲空"

fi

執行腳本,輸出結果以下所示:

abc = efg: a 不等於 b

abc != efg : a 不等於 b

-z abc : 字符串長度不爲 0

-n abc : 字符串長度不爲 0

abc : 字符串不爲空

 

文件運算符

屬性檢測描述以下:

操做符     說明         舉例

經常使用:

-d file        檢測文件是不是目錄,若是是,則返回 true。        [ -d $file ] 返回 false

-f file         檢測文件是不是普通文件(既不是目錄,也不是設備文件),若是是,則返回 true。    [ -f $file ] 返回 true。

-r file         檢測文件是否可讀,若是是,則返回 true。    [ -r $file ] 返回 true。

-w file       檢測文件是否可寫,若是是,則返回 true。    [ -w $file ] 返回 true。

-x file         檢測文件是否可執行,若是是,則返回 true。        [ -x $file ] 返回 true。

-s file         檢測文件是否爲空(文件大小是否大於0),不爲空返回 true。  [ -s $file ] 返回 true。

-e file        檢測文件(包括目錄)是否存在,若是是,則返回 true。    [ -e $file ] 返回 true。

#!/bin/bash

 

file="/home/shell/first.sh"

if [ -r $file ]

then

   echo "文件可讀"

else

   echo "文件不可讀"

fi

if [ -w $file ]

then

   echo "文件可寫"

else

   echo "文件不可寫"

fi

if [ -x $file ]

then

   echo "文件可執行"

else

   echo "文件不可執行"

fi

if [ -f $file ]

then

   echo "文件爲普通文件"

else

   echo "文件爲特殊文件"

fi

if [ -d $file ]

then

   echo "文件是個目錄"

else

   echo "文件不是個目錄"

fi

if [ -s $file ]

then

   echo "文件不爲空"

else

   echo "文件爲空"

fi

if [ -e $file ]

then

   echo "文件存在"

else

   echo "文件不存在"

fi

 

不經常使用:

-b file        檢測文件是不是塊設備文件,若是是,則返回 true。    [ -b $file ] 返回 false。

-c file         檢測文件是不是字符設備文件,若是是,則返回 true。        [ -c $file ] 返回 false。

-g file        檢測文件是否設置了 SGID 位,若是是,則返回 true。         [ -g $file ] 返回 false。

-k file        檢測文件是否設置了粘着位(Sticky Bit),若是是,則返回 true。  [ -k $file ] 返回

false。

-p file        檢測文件是不是具名管道,若是是,則返回 true。        [ -p $file ] 返回 false。

-u file        檢測文件是否設置了 SUID 位,若是是,則返回 true。        [ -u $file ] 返回 false。

Shell循環

for 、 while 、 until

 

for 變量 in 範圍

do

執行語句

done

#!/bin/bash

for i in 1 2 3

do

echo $i

Done

 

for i in `seq 1 100`

do

echo $i

done

Ps:seq用於產生從某個數到另一個數之間的全部整數

 

for i in {1..100}

do

echo $i

done

 

for((i = 1;i<=100;i++))

do

echo $i

done

ps:這裏寫的代碼均可以縮成一行寫不過每一句結束使用;號隔開

for i in {1..3};do echo $i;done

 

while [條件]

do

執行

done

 

#!/bin/bash

i=1

while [ $i -le 100 ]

do

echo $i

#變量自增

#i=`expr $i + 1 `

以下是let命令

let "i++"

done

 

 

i=1

while (($i <=100))

do

echo $i

let i++

done

 

until

until命令和while命令相似,while能實現的腳本until一樣也能夠實現,但區別是while循環在條件爲真時繼續執行循環而until則在條件爲假時執行循

也就是至關於條件取!

#!/bin/bash

i=1

while (($i >100))

do

echo $i

let i++

done

 

ps:

打印出 root目錄下的文件夾和文件名稱

#!/bin/bash

file="/root"

for f in `ls $file`

do

echo $f

done

 

$#:表示傳遞參數的個數

$*和$@:表示傳遞多個參數,在不添加雙引號的狀況下都是按照一個一個的輸入

#!/bin/bash

for i in $*或$@

do

echo $i

done

echo 「參數個數:」$#

./for.sh 1 2 3 4 5

$*和$@若是雙引號引發來的時候$*會將傳入的參數看作是一個總體,$@不變

for i in 」$*」

do

echo $i

done

echo 「參數個數:」$#

./for.sh 1 2 3 4 5

shell循環支持break和continue

 

shell case...in

case必須有in,一個段落結束必須用雙;;號,esac整個case結束標識

case 值 in

條件1)

執行語句

;;

條件1)

執行語句

;;

esac

ps:讀取內容使用 read -p(提示語句)變量

請輸入一個月份輸出對應的天數

#!/bin/bash

while :

do

read -p "請輸入一個月份:" month

case $month in

 2)

echo "28天"

break

;;

 1|3|5|7|8|10|12)

echo "31天"

break

;;

 4|6|9|11)

echo "30天"

break

;;

 *)  --> * 表明上面都沒有匹配上後的結果

echo "沒有這個月份"

continue

;;

esac

done

shell方法

function 方法名(){

執行體

return 值

}

ps:

1.能夠帶function 方法名()定義,也能夠直接 方法名() 定義,不帶任何參數。

2.參數返回,能夠顯示加:return 返回,若是不加,將以最後一條命令運行結果,做爲返回值

 

無返回值無參數

#!/bin/bash

function func1(){

 echo "this is my first function"

}

echo "-------開始-------"

firstfun

echo "-------結束-------"

 

有返回值無參數

function func2(){

echo "請輸入兩個數:"

echo "輸入第一個數字爲:"

read fnum

echo "輸入第二個數字爲:"

read snum

echo "輸入兩個數分別爲:$fnum and $snum"

return $(($fnum + $snum)) --> 這樣寫 等價於 `expr $fnum + $snum`

}

func2

echo "輸入兩個函數之和爲:$?"

 

函數返回值在調用該函數後經過 $? 來得到。

ps:全部函數在使用前必須定義。這意味着必須將函數放在腳本開始部分,直至shell解釋器首次發現它時,纔可使用。調用函數僅使用其函數名便可。

 

 

函數參數

在Shell中,調用函數時能夠向其傳遞參數。在函數體內部,經過 $n 的形式來獲取參數的值,例如,$1表示第一個參數,$2表示第二個參數...

無返回值有參數

function func3(){

echo "第1個參數:$1"

echo "第2個參數:$2"

echo "第10個參數:$10"

echo "第10個參數:${10}"

echo "參數個數:$#"

echo "輸出全部參數:$*"

}

func3 1 2 3 4 5 6 7 8 9 34 73

ps:

$10 不能獲取第十個參數,獲取第十個參數須要${10}。當n>=10時,須要使用${n}來獲取參數。參數用空格分開

 

shell 文件引入和簡單調試

Shell 文件引入

和其餘語言同樣,Shell 也能夠包含外部腳本。這樣能夠很方便的封裝一些公用的代碼做爲一個獨立的文件。

Shell 文件包含的語法格式以下:

. 文件路徑   # 注意點號(.)和文件名中間有一空格

source 文件路徑

 

案例:

vi 1.sh

#!/bin/bash

name='123'

 

vi 2.sh

chmod a+x 2.sh

#!/bin/bash

. /root/shell/1.sh

#source /home/shell/1.sh

echo $name

 

執行:

 ./2.sh

 

shell的語法檢測:至關於java的編譯

#!/bin/bash

echo "welcome to shell debug"

for i in 1 2 3 4 5 6

do

echo $i

done

echo "shell debug is over"

 

一、shell語法檢測:

sh -n ./test.sh   (sh是/bin/sh  是系統提供的可執行腳本)

二、shell的普通調試:

sh -x ./test.sh  

進入調試模式後,Shell依次執行讀入的語句,產生的輸出中有的帶加號,有的不帶,以下。

帶加號表示該條語句是Shell執行的。

不帶加號表示該語句是Shell產生的輸出。

shell的中斷調試:(在shell中添加一個睡眠,保證能夠有時間中斷調試 sleep 3 睡眠3秒執行下一個語句)

#!/bin/bash

echo "welcome to shell debug"

for i in 1 2 3 4 5 6

do

echo $i

sleep 3

done

echo "shell debug is over"

在調試過程當中能夠按Ctrl + Z中斷調試,觀察結果,而後再按fg鍵繼續調試便可。(先按f在按g鍵)

 

使用調試工具-bashdb

腳本比較大時,經過-x參數調試時已不方便時.

上傳

解壓能夠跟路徑

tar -xzvf bashdb-4.4-0.92.tar.gz -C /usr/src

進入到對應的目錄

 cd /usr/src/bashdb-4.4-0.92

生成makefile文件

./configure

安裝

make install

調試方法

調試命令:

./bashdb --debugger 文件所在路徑

【經常使用命令】

l             列出當前行上下各5行,總共10行

q|quit        退出

h             幫助

/for/         向後搜索字符串for

?for?         向前搜索字符串for

x 1+2         計算算術表達式的值

!! ls -laRt   執行shell命令

n             執行下一條語句

s 4           單步執行4次,如遇到函數則進入函數裏面

b 4           在行號4處設置斷點

del 4         刪除行號爲4的斷點

c 10          一直執行到行號10處  

R|run         從新執行當前調試腳本

finish        執行到程序最後

 

linux 時間

將當前時間格式化:

date +"%Y%m%d"  或者 date +"%Y-%m-%d"

獲取當天先後日期:(x爲正數便是向前,負數則是向後)

date -d "x days ago" +%Y%m%d

date -d "x weeks ago" +%Y%m%d

date -d "x months ago" +%Y%m%d

date -d "x years ago" +%Y%m%d

 

定時任務

crontab -e 開啓定時任務

crontab -r 刪除定時任務

minute   hour   day   month   week   command     順序:分 時 日 月 周

中間是tab隔開

minute:    表示分鐘,能夠是從0到59之間的任何整數。

hour:         表示小時,能夠是從0到23之間的任何整數。

day:  表示日期,能夠是從1到31之間的任何整數。

month:     表示月份,能夠是從1到12之間的任何整數。

week:       表示星期幾,能夠是從0到7之間的任何整數,這裏的0或7表明星期日。

command:要執行的命令,能夠是系統命令,也能夠是本身編寫的腳本文件。

星號(*):表明全部可能的值,例如month字段若是是星號,則表示在知足其它字段的制約條件後每個月都執行該命令操做。

逗號(,):能夠用逗號隔開的值指定一個列表範圍,例如,「1,2,5,7,8,9」

中槓(-):能夠用整數之間的中槓表示一個整數範圍,例如「2-6」表示「2,3,4,5,6」

正斜線(/):能夠用正斜線指定時間的間隔頻率,例如「0-23/2」表示每兩小時執行一次。同時正斜線能夠和星號一塊兒使用,例如*/10,若是用在minute字段,表示每十分鐘執行一次

例子:

每隔一分鐘向目錄下寫文件

*/1   *       *       *       * echo "hello world" >> /root/test.log

tail -f test.log 監控文件

 

同步時間

date查看當前時間

Linux服務器運行久時,系統時間就會存在必定的偏差

ntpdate -u 地址

沒有命令就yum install -y ntpdate

ntp經常使用服務器

中國國家授時中心:210.72.145.44

NTP服務器(上海ntp.api.bz

阿里雲NTP:ntp1.aliyun.com (數字1-7均可以以)

 

awk和sed

這兩個命令至關於linux下shell中的框架

 

介紹第一個方法

cut [選項]  文件名        默認分割符是製表符(tab)

選項:

    -f 列號:    提取第幾列

    -d 分隔符:    按照指定分隔符分割列

建立一個文件 vi cut.log

 

cut -f  2  cut.log   提取第二列

cut -f  1,2  cut.log   提取第一,二列

查看passwd文件下

cut -d ":" -f 1,3 /etc/passwd  以:分割,提取第1和第3列

 

咱們是以空格切分的可是須要注意的是咱們在使用cat中的空格是一個空格因此

 

這樣切割不會有任何輸出,理論上咱們查看的是第二行,但實際由於這個空是默認後面第一個空格因此咱們得不到第二列 而是 空格後面的空格

因此咱們要的到第二列要獲取全部空格碼?

cut的侷限性    不能分割空格   df -h  不能使用cut分割

 

awk

一個強大的文本分析工具

把文件逐行的讀入,以空格爲默認分隔符將每行切片,切開的部分再進行各類分析處理。

語法:awk ‘條件1{動做1}條件2{動做2}...’文件名

條件(Pattern):

通常使用關係表達式做爲條件: >   >=  <=等

動做(Action):

格式化輸出

流程控制語句

df -h | awk '{print $1}'      顯示第一列

df -h | awk '{print $1 $2}'   顯示第一列和第二列

df -h | awk '{print $1 "\t" $2}'      顯示第一列和第二列 \t分割

這裏並無條件而是直接輸出數據

這裏還可使用printf 打印 可是沒有換行 建議使用 print

FS內置變量

 

能夠發現打印的數據第一行沒有分割是由於FS是一個內置變量會先讀取文件的第一行,因此爲了保證第一行的讀取修改成:

 

 cat  /etc/passwd  |  awk 'BEGIN {FS=":"} {print $1 "\t" $2 "\t" $3 }'    

輸出可登錄用戶的用戶名和UID,這裏使用FS內置變量指定分隔符爲:,並且使用BEGIN保證第一行也操做,由於awk命令會在讀取第一行後再執行條件

 

指定分隔符還能夠用-F更簡單

cat /etc/passwd  |  awk -F:  '{print $1 "\t"$3 }'   效果同上

ps: awk 的默認分隔符是空格,因此要是分割空格的話能夠直接省略-F

df -h | awk ‘{print $1}’

 

BEGIN  在全部數據讀取以前執行

 在輸出以前使用BEGIN輸出內容

awk 'BEGIN {printf "first Line \n"}   

END 在全部數據執行以後執行

全部命令執行完後,輸出一句"The End"

awk 'END {printf "The End \n"}  

過濾sda3硬盤並打印第五行以%分割取後面的結果

 df -h | grep sda3 | awk '{print $5}' | awk -F% '{print $1}'

過濾sda3硬盤並打印第五行以%分割取第一行

df -h | grep sda3 | awk '{print $5}' | cut -d"%" -f 1

獲取全部用戶信息裏的用戶名:      

cat /etc/passwd | awk -F: '{print $1}'

awk -F: '{print $1}' /etc/passwd

獲取當前機器的ip地址:

# ifconfig eth0 | grep 'inet addr' | awk -F: '{print $2}' | awk '{print $1}'

 

sed: stream editor 

s e d是一個非交互性文本編輯器。它編輯文件或標準輸入導出的文本拷貝。標準輸入可 能是來自鍵盤、文件重定向、字符串或變量,或者是一個管道的文本。

ps: s e d 並不與初始化文件打交道, 它操做的只是一個拷貝,而後全部的改動若是沒有重定向到一個文件,將輸出到屏幕。

語法:sed [選項]’[動做]’ 文件名

經常使用選項:

-n  使用安靜(silent)模式。顯示通過sed特殊處理的數據。

-e  容許多點編輯。

-i  直接修改讀取的檔案內容,而不是由屏幕輸出。

命令

功能描述

a\

新增, a 的後面能夠接字串,在下一行出現

c\

替換

d

刪除

i\

插入, i 的後面能夠接字串

p

打印

s

查找並替換,例如 1,20s/old/new/g

 

sed '2p' cut.log    顯示第二行和全部數據

sed -n '2p' cut.log   顯示第二行

sed ‘2a HBase’cut.log 在第二行後面添加數據

sed ‘2i hive 60’cut.log 在第二行前添加數據

 

sed ‘2a hive \

 hbase \

 flume’cut.log

在第2行以後 添加多行 以換行的形式能夠添加多行

sed ‘2c hbase 80’cut.log 替換第二行數據

ps:g全局替換的意思

sed ‘s/spark/spark2.0/g’ cut.log  把cut.log文件中的spark替換爲spark2.0,並輸出

sed -e '2s/spark/spark2.0/g; 4s/yarn//g' cut.log     同時進行多個替換

sed –i  ‘s/spark/spark2.0/g’ cut.log   要想真正替換,須要使用-i參數

使用sed獲取機器的ip地址

ifconfig eth0 | grep 'inet addr:'| sed 's/^.*addr://g' | sed 's/  Bcast.*$//g'

ps:^開始正則表達式$結束正則表達式

 

 

 

 

 

快照和克隆:

什麼是快照?

快照至關於將機器在某一個時間點的狀態保存下來,若之後出現任何問題均可以經過這個快照回覆到快照時的狀態

快照操做很簡單

ps:須要作快照的話建議在關機之後第一時間進行快照自做,開機狀態也能夠可是我的不太推薦

 

 

 

若想恢復到上一個拍攝快照的時間點(當時系統的樣子也很簡單)

 

 

克隆:

不管是hadoop仍是Spark都須要集羣,不多是一臺機器,經過光盤安裝成本臺高,因此咱們使用克隆的方式來建立出4臺機器

克隆必定要在關機狀態下完成

 

 

 

 

 

 

 

克隆完後須要修改幾個位置

 

1.

 

  1. 修改映射地址若以前修改過就不須要改了沒有的話 就是修改IP和 對應的名字  修改的時候建議修改windows中的hosts這樣就能夠在外部訪問時使用名字C:\Windows\System32\drivers\etc下的hosts修改 寫的方式和linux中hosts一直就行

 

            2.ip地址和硬件地址

解決方案1:

vi /etc/sysconfig/network-scripts/ifcfg-eth0中的修改mac配置信息 和註釋UUID(#註釋)

 

 

修改網卡信息:

 

 

3,重啓系統 reboot

 

解決方案2:

1,直接刪除/etc/sysconfig/network-scripts/ifcfg-eth0中的mac配置信息和UUID

 

2,直接刪除文件 /etc/udev/rules.d/70-persistent-net.rules

 

4,重啓系統 reboot

ps: 作完這些必定要重啓機器

相關文章
相關標籤/搜索