kali Linux shell程式設計基礎到進階
前幾天在群裡聽他們說不會shell程式設計就不算會linux,嘿,就我這暴脾氣,學!幹!嘿嘿!行了,不扯犢子了,犢子要生氣了,最近學習了shell,感觸頗多,我也參考了其他大佬的經驗,看著視訊課,學了些許基礎,其實也就是那回事,認認真真踏踏實實的學,是能學到東西的,還有,要是自學的話,一定要能坐得住啊!
shell介紹
shell(外殼)是C語言編寫的程式,是使用者使用linux的橋樑,shell既是一種命令也是一種程式設計語言,即就是指令碼語言。常見的指令碼語言有JavaScript、VBScript、ASP、JSP、PHP、SQL、Perl、shell、python、Ruby、JavaFX、Lua等,shell其實是一種應用程式,這個應用程式提供了一個使用者介面。linux中有很多型別的shell,不同的shell具備不同的功能shell還決定了指令碼中函式的語法,linux中預設的shell是 /bin/bash,
bash:大多數linux系統預設使用的shell都是這個,bash shell是 bourne shell的一個免費版本,是最早的Unix shell,bash還有一個特點就是通過help可以檢視幫助,它包含的功能幾乎涵蓋了shell所有的功能,所以一般的shell指令碼都會指定它為執行路徑。
一、shell入門
入門很簡單,如果你學過其他的程式語言就更容易上手,還有linux的vim最好能會用,就是基本的操作就可以了,進度就會很快的。
先給大夥說一下,我使用的系統是kali linux,許可權在root使用者下。
程式碼規範
#!/bin/bash 指定告知系統當前這個指令碼要使用的shell直譯器,這行一般都寫在首部
shell相關指令
檔案命名規範:
檔名.sh .sh是linux下的bash shell的預設字尾
使用流程:
(1)建立.sh 檔案 |
touch test.sh |
(2)編寫shell程式碼 |
|
(3)執行 |
指令碼必須得有執行許可權 chmod u+x 檔名.sh |
練習:建立一個test.sh 檔案指令碼程式,輸出屬於我們的 hello world
注意:輸出的內容如果包含字母和符號,則需要用引號包括起來,如果是純數字,可以包也可以不包。
(1)先建立檔案 touch test.sh
(2) vim test.sh 進入編輯,
1 #!/bin/bash
2 echo "hello,world"
(3)完成後按一下 ESC 再shift + : 再輸入wq進行儲存退出
echo是bash的輸出語句相當於C語言的printf,C++的cout,java的print
前面的我儘可能的把細節說一下,後面就不提了,這些基本的操作一定要熟練才是。
加上執行許可權:chmod ugo+x test.sh 為所有使用者加上此檔案的可執行許可權,你可能就注意到剛寫的test.sh綠了,咳咳,別多想,它就表示整個檔案是可執行檔案
執行:./test.sh 一定要寫成 ./test.sh ./ 就相當於告訴系統就在當前目錄找。
這種執行方式最常用 注意了,test.sh此時在Desktop下,能直接執行,若是沒有在直接路徑,就得加上路徑名比如:
練習:使用root賬戶建立並執行test2.sh 實現建立一個shelltest使用者並在其家目錄建立新的檔案try.html
兩步走:(1)新增使用者(2)建立檔案如下:
1 #!/bin/bash
2 useradd -m -g xk shelltest
3 touch /home/shelltest/try.html
-g 是指定使用者所在的組,-m是引數,這個解釋起來較麻煩,你可以自己查一查
在bash裡面,寫入的Linux命令沒有什麼特別的地方,不需要語法,就和平常鍵入命令一樣,指令碼一旦執行命令也就執行了
然後給這個指令碼新增可執行許可權並且執行:
執行檢視:家目錄下使用者建立成功,對應的檔案也建立了
二、進階
恭喜你通過了入門?納尼?太快了?基礎其實很easy,瞭解一些基本的手法足矣,來繼續吧
1.變數的定義與使用
語言都是相通的,這裡的變數和其他語言的變數含義一樣。先定義後使用
定義:class_name="new class" 後面不用分號,最好就是一行一條命令
使用:echo $ class_name 這是個美元 $ 符號,一旦要使用變數,這個符號必須要用
以下幾點:
(1)在bash裡面變數不需要宣告,直接寫出來直接用$呼叫。
(2)左邊是變數名,右邊是變數值
(3)變數名和變數值是使用和被使用的關係;用變數名來使用變數值
(4)使用變數的時候一定要在變數名前面加 $ 符號,這個在其他語言中也是存在的(php)
變數名的規範
注意,變數名後面的等號左右不能有空格,這可能和你熟悉的所有程式語言都不一樣,同時命名須遵守以下規則:
(1)命名只能用英文字母,數字和下劃線,首字母不能用數字
(2)中間不能有空格,可以使用下劃線
(3)不能使用標點符號。
(4)不能使用bash的關鍵字,使用help可以檢視相關的關鍵字
練習:使用變數輸出hello world
1 #!/bin/bash
2 str="hello world"
3 echo $str
如下:
關於單引號和雙引號:
在這裡雙引號和單引號是有差異的,shell命令執行時會將雙引號的內容進行解析,它能認識裡面的變數,若是而單引號就不行了,若是寫成 echo '$str' 則會輸出 $str ,改成"$str" 則會輸出hello world,此外雙引號還能實現轉義
練習:
給定一個變數,輸出現在的時間
1 #!/bin/bash
2 Time=`date "+%Y-%m-%d %H:%M:%S"`
3 echo $Time
注意反引號(esc下面的那個鍵),當在指令碼中需要執行一些指令,並且將其賦給執行結果時需要用到
2.只讀變數(瞭解)
語法:readonly 變數名
只讀變數不能進行更改,只可以讀取,就像C的巨集定義C++的const一樣嚴謹。
練習:定義變數a 並且其值為10 ,隨後設定其值為只讀變數,再嘗試更改
1 #!/bin/bash
2 a=10
3 readonly a
4 a=20
5 echo $a
程式碼第4行想要對a進行更改被它的本身禁止了,大家有沒有發現,即使第四行出現了錯誤,但是第五行依然執行了,所指在shell中如果程式不是相互的依賴關係(比如迴圈和條件判斷),只是單行的命令,它們之間的執行是不會相互影響的,不像其他語言,一個地方出錯整個程式就會終止,這也是bash的靈活之處。
3.接收使用者輸入(重點)
學習了輸出,來看看輸入吧。
語法:read -p 提示資訊 變數名
你可以理解為:bash會將你輸入的資訊讀取到記憶體中進行執行
-p prompt : 提示資訊
變數名:你所輸入的資訊會存入到你指定的這個變數中,後面的使用會呼叫變數達到對輸入的資訊進行操作
練習:編寫指令碼test.6,要求執行之後提示使用者輸入檔案的名稱(可指定路徑),然後自動為使用者建立該檔案並提示建立成功
1 #!/bin/bash
2 read -p '請輸入需要建立檔案的路徑:' filepath
3 touch $filepath
4 echo '建立成功'
5 ls -l $filepath
執行:
4.刪除變數(用的不多,瞭解)
語法 unset 變數名
練習: 定義變數b=20,在輸出b的值,然後刪除b,最後輸出b
1 #!/bin/bash
2 b=20
3 echo $b
4 unset b
5 echo $b
在這裡雖然不輸出資料但是會有一個換行,別忽略了這個小細節
5.條件判斷語句
語法1:(一個條件)
if condition
then
command1
command2
…
fi //記住了:if的條件判斷中命令結束後一定要使用 fi 來關閉
單行寫法(一般在命令列中執行的寫法):if [condition];then command;fi
fi表示閉合
語法2:(兩個條件)
if condition
then
command1
command2
…
else
command
fi
語法3:(多個條件)
if condition
then
command1
elif condition2
then
command2
else
commandN
fi
6.運算子
原生bash不支援簡單的數學運算,但是可以通過其他命令來實現,awk和expr,
expr最常用,是一款表示式計算工具,使用它能完成表示式的求值操作。如下:
例如:兩個數相加(注意使用的是反引號` 而不是單引號)
#!/bin/bash
val=`expr 2 + 2`
echo "兩個數的和為:$val"
兩點注意:
(1)表示式和運算子之間要有空格,2+2就是不對的,必須寫成2 + 2,這與我們熟悉的大多數語言不一樣
(2)完整的表示式要被 `` 包含
練習:兩數的四則運算 以及是否相等:
1 #!/bin/bash
2 a=4
3 b=3
4 echo 'a =' $a
5 echo 'b =' $b
6 c=`expr $a + $b`
7 echo 'a + b =' $c
8 echo 'a - b =' `expr $a - $b`
9 echo 'a * b =' `expr $a \* $b` # 這裡注意:乘法要用 \*
10 echo 'a / b =' `expr $a / $b`
11 echo 'a % b =' `expr $a % $b`
12 #判斷是否相等
13 if [ $a == $b ]
14 then
15 echo 'a等於b'
16 else
17 echo 'a不等於b'
18 fi
19 #判斷不相等
20 if [ $a != $b ]
21 then
22 echo 'a不等於b'
23 else
24 echo 'a等於b'
25 fi
要注意表示式格式和if判斷[ ] 前面和後面都要有空格
執行:
7.關係運算符
關係運算符只支援數字,不支援字串,除非字串的值是數字
'123' 1233 就可以 'abc'就不行了
記英文比記簡寫容易的多
-eq |
equal |
-neq |
not equal |
-gt |
great than |
-lt |
less than |
-ge |
great equal |
-le |
less equal |
練習:進行兩數的判斷
程式碼比較多,別慌,都很簡單,只是把多個關係運算放在了一個裡面
1 #!/bin/bash
2 a=10
3 b=20
4 echo "a = $a"
5 echo "b = $b"
6 if [ $a -eq $b ]
7 then
8 echo 'a = b'
9 else
10 echo 'a ≠ b'
11 fi
12 if [ $a -ne $b ]
13 then
14 echo 'a ≠ b'
15 else
16 echo 'a = b'
17 fi
18 if [ $a -ge $b ]
19 then
20 echo 'a > b'
21 else
22 echo 'a < b'
23 fi
24 if [ $a -lt $b ]
25 then
26 echo 'a < b'
27 else
28 echo 'a > b'
29 fi
30 if [ $a -le $b ]
31 then
32 echo 'a ≤ b'
33 else
34 echo 'a ≥ b'
35 fi
36 if [ $a -ge $b ]
37 then
38 echo 'a ≥ b'
39 else
40 echo 'a ≤ b'
41 fi
執行:
練習:編寫指令碼,輸入任意使用者,判斷使用者是否存在。
費了點時間,剛開始不知道咋搞,一步步試下來的。
首先用read -p 接收輸入的使用者名稱。這一點是肯定有的,接下來就是進行怎樣的判斷,兩種方法:
cat /etc/passwd 檔案和 id user。因為建立的使用者都在這裡可以查到,這裡的選擇在於進行怎樣的轉換,
是用使用者id以數字顯示,還是使用者名稱,其實兩個都行,後者可讀效能高些,
記得把查詢到過濾好的資訊一定要將它變成變數的形式:$(過濾資訊)。然後進行字串的判斷 用 " " 包起來。
(1)cat /etc/passwd |grep inputuser 先看看格式,再決定怎麼過濾和擷取
cut -d ":"-f 1 : 以冒號為擷取關鍵字,-f 是取擷取後的第幾個,1就是擷取的第一個: xk
如下程式碼:
#!/bin/bash
read -p '請輸入要查詢的使用者:' inputuser
finduser=$( cat /etc/passwd |grep $inputuser |cut -d ":" -f 1)
if [ "$finduser" == "$inputuser" ]
then
echo '使用者存在,如下:'
cat /etc/passwd |grep $inputuser
else
echo '使用者不存在'
fi
執行如下:
(2)id user,先看看效果
這裡我的意思是,如果使用者存在的話,他肯定有對應的 'uid'關鍵字。以uid作為中間引數。
如下程式碼:
#!/bin/bash
read -p '請輸入要查詢的使用者:' inputuser
finduser=$( id $inputuser |cut -d "=" -f 1)
if [ "$finduser" == "uid" ]
then
echo '使用者存在,如下:'
id $inputuser
else
echo '使用者不存在'
fi
執行查詢如下
8.邏輯運算子
練習以上幾個運算子:
#!/bin/bash
a=10
b=20
if [ !false ]
then
echo '真'
else
echo '假'
fi
if [ $a -le $b -o $a -gt $b ]
then
echo "真"
else
echo "假"
fi
if [ $a -lt $b -a $b -ge 30 ]
then
echo '真'
else
echo '假'
fi
9.字串運算子
10.檔案測試運算子
測試:
執行指令碼
可執行和不可執行:有一個使用者有執行許可權則為指令碼認為這個檔案就有可執行許可權
11.shell指令碼附帶選項
自己編寫一些命令。
傳遞:
./ test.sh a b c
接收:在指令碼中可以用$1 表示 a,$2 表示b $3 表示c。注意 $0表示指令碼檔案本身
編寫test13.sh 傳遞 a b c
可以看得出來,bash的輸入不需要其他什麼input、scanf之類的語法以及宣告,而是直接輸入,引數也就傳遞進去了
練習:建立自定義指令"user",可以直接執行,要求如下:
a.user-add 使用者名稱 |
新增使用者 |
b.user-del 使用者名稱 |
刪除使用者及其家目錄 |
#!/bin/bash
if [ $1 == '-add' ]
then
useradd -m -g xk -G sudo,root,adm $2
else
userdel -r $2
fi
-g是使用者組
-G是附加許可權組
這個指令碼的執行方式就是一旦發現關鍵字'-add user' 就開始執行下面的新增使用者命令。
進行執行和檢視,最後刪除這個測試的使用者
然後將指令碼用別名機制寫成指令: vim ~/.bashrc
找到下面的alias關鍵字,仿照語法新增別名'user'
也就是說,這個別名機制成功建立後你在命令列鍵入user就相當於執行寫的指令碼命令,
可以理解為對映,注意指令碼路徑一定要寫對。
然後執行,我這將新增和刪除命令全執行了一次,如下:
擴充套件:
1.建立bash檔案的時候自動新增可執行許可權,什麼意思呢?每次你建立一個.sh檔案次序基本是
(1)touch test.sh
(2)寫程式碼
(3)chmod u+x test.sh
是不是很麻煩?能不能在建立的同時就給檔案可執行許可權呢?答案是肯定的!
如下:如何實現將兩個命令銜接起來實現同時執行呢?我也只是試了一下,沒想到還真行!
用 && 進行連線!實現兩個或者多個命令同時執行,多個我沒試過,只是我的猜測,你可以試試哈!
我在這裡命令是給其他使用者許可權,你也可以自己給別的使用者許可權
#/bin/bash
touch $1 && chmod o+x $1
執行一下:
是不是很舒服呢?
指令碼寫好後使用別名機制寫一個屬於自己的指令碼命令我這裡起的名字是mkfile,如果你對別名感興趣也可以多寫幾條自己常用的.
然後再次執行一下:
是不是更爽了呢?就是這麼好玩!
好了,到這裡差不多就結束了,shell的路途還得好好走一陣子,各位同學加油哈!命令和指令碼語言一定要多使用,慢慢的也就精通了,一定不能過於著急,要穩得住,坐得下,咳咳,話有點多了哈!總之,努力吧