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,也是外面的生效
一、變量定義
定義變量時,變量名不加美圓符號$如:
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命令
能夠將四則運算的結果賦值給變量
須要注意:
#!/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
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]}
五、數組循環遍歷
以"#"開頭的行就是註釋,會被解釋器忽略。(除第一行的解釋器之外)
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。
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
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
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 文件包含的語法格式以下:
. 文件路徑 # 注意點號(.)和文件名中間有一空格
或
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 執行到程序最後
將當前時間格式化:
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均可以以)
這兩個命令至關於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.
2.ip地址和硬件地址
vi /etc/sysconfig/network-scripts/ifcfg-eth0中的修改mac配置信息 和註釋UUID(#註釋)
修改網卡信息:
3,重啓系統 reboot
1,直接刪除/etc/sysconfig/network-scripts/ifcfg-eth0中的mac配置信息和UUID
2,直接刪除文件 /etc/udev/rules.d/70-persistent-net.rules
4,重啓系統 reboot
ps: 作完這些必定要重啓機器