一、shell簡介
1. 什麼是shell?
- shell就是一個解釋器,當用戶向linux內核發送命令的時候,先發送到shell,shell將命令轉化成linux內核能識別的指令,然後發送給linux內核。
- 用戶可以用Shell來啓動、掛起、停止或者編寫一些程序
- Shell還是一個功能相當強大的編程語言,易編寫,易調試,靈活性較強。
- Shell是解釋執行的腳本語言,在Shell中可以直接調用Linux系統命令。
二、shell基礎
1. 查看支持的shell
```
cat /etc/shells
```
- shell有很多種,我們可以通過cat /etc/shells來查看有哪些shell
- 一般我們使用/bin/bash這個shell
2.查看shell的幫助信息
命令 |
作用 |
man bash |
查看bash的命令幫助 |
info bash |
查看bash的文檔 |
help |
命令顯示bash支持的命令 |
help cd |
如果想看某個命令的幫助可以 help 命令 |
3. echo
- 輸出命令
- -e支持轉義字符
```
echo hello //輸出hello
echo hello\r\n //輸出hellorn
echo "hello\r\n" //輸出hello\r\n
echo -e "hello\r\nworld"
//輸出:
hello
world
```
控制字符 |
作用 |
\n |
換行符 |
\r |
回車鍵 |
\t |
製表符,也就是Tab鍵 |
\v |
垂直製表符 |
\onnn |
按照八進制ASCII碼錶輸出字符,其中0爲數字零,nnn是三位八進制數 |
\xhh |
按照十六進制ASCII碼錶輸出字符,其中hh是兩位十六進制數 |
符號 |
顏色 |
#30m |
黑色 |
#31 |
紅色 |
#32 |
綠色 |
#33 |
黃色 |
#34 |
藍色 |
#35 |
洋紅 |
#36 |
青澀 |
#37 |
白色 |
echo -e "12\r\n34\t56\v78"
//以上輸出:
12
34 56
78
echo -e "\0141"
//以上輸出a,就是將8進制轉換成十進制數,然後對照ASCII表輸出字符
echo -e "\x61"
//以上輸出a,就是將十六進制轉成十進制,然後對照ASCII表輸出字符
echo -e "\e[1;31m warning \e[0m"
//輸出紅色的warning,顏色需要對照上面的表格
- 特別注意:輸出帶顏色的內容,格式是:
```
echo -e "\e[1;顏色符號 內容 \e[0m"
```
- 顏色符號對照上表,內容左右沒有空格
4. 編寫執行shell
4.1 編寫shell腳本
- 一般編寫shell腳本,在腳本最上面會聲明#!/bin/bash,代表是shell腳本執行,並且是/bin/bash下的shell
- 編寫shell文件舉例如下:
```
#!/bin/bash
echo -e "\e[1;34m hello world \e[0m"
```
- 編寫好的shell腳本文件必須以.sh作爲文件後綴
4.2 執行shell腳本
- 執行有兩種方式:
- 方式一:bash 文件
- 方式二:./文件
- 注意:方式二執行文件前,必須先讓文件有權限,即:
```
chmod u+x ./文件
//其中chmod表示change mode
//也可以使用
chmod 755 文件
```
- 舉例執行shell文件
```
bash ./test.sh
//或
chmod 755 ./test.sh
./test.sh
```
5. 別名
- 查看所有別名
```
alias
```
- 查看指定別名
```
alias ls
```
- 設置臨時別名
```
alias yuhua="cd /home/yuhua"
```
- 這樣執行yuhua這個命令就相當於執行"cd /home/yuhua",不過這是臨時的,重啓機子後就沒有了
- 設置永久別名(2步走,第一步寫入,第二部使生效)
- 需要寫入環境變量配置文件,即~/.bashrc文件
```
su //進入root用戶
vi ~./bashrc
//可以在裏面添加別名
alias yuhua="su yuhua"
```
- 然後使修改後的文件生效,有兩個命令均可使用
- 方法一:使用source
```
source ~/.bashrc
```
- 方法二:使用點.
```
. ~/.bashrc
```
- 刪除臨時別名
```
unalias yuhua
```
- 永久刪除別名
```
進入 ~/.bashrc
然後刪除別名
然後source ~/.bashrc
```
- 當永久別名跟臨時別名是同一個時,臨時別名優先
- 舉例:
- 設置了永久別名alias yuhua="echo 1"
- 也設置了臨時別名alias yuhua="echo 2"
- 當執行yuhua,會打印出2
6. 命令的生效順序
- 找:絕對路徑或者相對路徑,找不到走下一步
- 找:別名,找不到走下一步
- 找:bash內部命令,找不到走下一步
- 找:按照$PATH環境變量定義的目錄查找順序找到的第一個命令
- 注意:查看環境變量定義的目錄,使用命令
```
echo $PATH
//會得到的結果是:/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/home/yuhua/bin
//該結果代表環境變量定義的目錄,有很多,以:分割
```
7. 命令快捷鍵
命令 |
含義 |
ctrl+c |
強制終止當前命令 |
ctrl+l |
清屏 |
ctrl+a |
光標移動到命令行首 |
ctrl+e |
光標移動到命令行尾 |
ctrl+u |
從光標所在的位置刪除到行首 |
ctrl+z |
把命令放入後臺 |
fg |
把任務帶回前臺 |
ctrl+r |
在歷史命令中搜索 |
- 注意:在這裏,所謂的把任務放入後臺與帶回前臺指的是:
- 當我輸入命令,輸完,並不是馬上就執行結束的,可能是等待的過程,也就是當前命令一直在進行中,那麼這時候可以使用ctrl+z把命令帶入後臺執行,這樣你就可以繼續操作了;同樣的,對弈在後臺執行的命令,可以用fg把任務待會前臺,這樣你就不能繼續操作了
8. 歷史命令
- history [選項] [歷史命令保存文件]
- 選項
- -c 清空歷史命令
- -w 把緩存中的歷史命令寫入歷史命令保文件 ~/.bash_history
- 默認保存1000條 /etc/profile HISSIZE=10000
9. 調用
- 使用上下箭頭調用以前的歷史命令
- 使用 !n 重複執行第n條歷史命令
- 使用 !! 重複執行上一條命令
- 使用 !字符 重複執行最後一條以該字符串開頭的命令
```
history -c
1 echo 1
2 echo 2
3 echo 3
!2
!!
!echo
```
10. 輸出重定向
10.1 標準輸入輸出
設備 |
設備文件名 |
文件描述符 |
類型 |
鍵盤 |
/dev/stdin |
0 |
標準輸入 |
顯示器 |
/dev/stdout |
1 |
標準輸出 |
顯示器 |
/dev/stderr |
2 |
標準錯誤輸出 |
類型 |
符號 |
作用 |
標準輸出重定向 |
命令 > 文件 |
以覆蓋的方式,把命令的正確輸出輸出到指定的文件或設備當中 |
標準輸出重定向 |
命令 >> 文件 |
以追加的方式,把命令的正確輸出輸出到指定的文件或設備當中 |
錯誤輸出重定向 |
命令>文件 |
以覆蓋的方式,把命令的錯誤輸出輸出到指定的文件或設備當中 |
錯誤輸出重定向 |
命令>>文件 |
以追加的方式,把命令的錯誤輸出輸出到指定的文件或設備當中 |
正確輸出和錯誤輸出同時保存 |
命令>文件 2>&1 |
以覆蓋的方式,把正確輸出和錯誤輸出都保存到同一個文件當中 |
正確輸出和錯誤輸出同時保存 |
命令>文件 2>>&1 |
以追加的方式,把正確輸出和錯誤輸出都保存到同一個文件當中 |
正確輸出和錯誤輸出同時保存 |
命令&>文件 |
以覆蓋的方式,把正確輸出和錯誤輸出都保存到同一個文件當中 |
正確輸出和錯誤輸出同時保存 |
命令&>>文件 |
以追加的方式,把正確輸出和錯誤輸出都保存到同一個文件當中 |
正確輸出和錯誤輸出同時保存 |
命令>>文件1 2>文件2 |
以覆蓋的方式,正確的輸出追加到文件1中,把錯誤輸出追加到文件2中 |
10.2 輸入重定向
- wc命令的功能爲統計指定文件中的行數、單詞數、字節數(換行回車表示一個字節), 並將統計結果顯示輸出
- 命令 < 文件把文件做爲命令的輸入
- 命令 << 標識符 標識符把標識符之間內容作爲命令的輸入
- wc < access.log
[root@localhost ~]# wc <<!
> hello world
> !
1 2 12
//這裏的wc << ! 這個!是一個定界符,也就是當你輸入的時候,輸入當!表示結束了
//特別注意:這裏的!是任意取的,你可以寫@,也可以寫EOF,甚至可以寫yuhua
11. 管道符號
11.1 多命令順序執行
多命令執行符 |
格式 |
作用 |
案例 |
; |
命令1;命令2 |
多個命令執行,命令之間沒有任何邏輯聯繫 |
echo 1;echo 2; |
&& |
命令1&&命令2 |
邏輯與 當命令1正確執行,則命令2纔會執行 當命令1執行不正確,則命令2不會執行 |
echo 1&&echo 2; |
\\ |
命令1\\ 命令2 |
邏輯或 當命令1執行不正確,則命令2纔會執行 當命令1正確執行,則命令2不會執行 |
echo 1\\echo 2; |
- date;ls;date;ls
- ls && echo yes || echo no
11.2 管道符
- 命令1的正確輸出會作爲命令2的操作對象
- 命令1|命令2
```
ls /etc/ | more
netstat -an | grep ESTABLISHED | wc -l
```
11.3 通配符
- 匹配文件名和目錄
通配符 |
作用 |
? |
匹配一個任意字符 |
* |
匹配0個或任意字符,也就是可以匹配任意內容 |
[] |
匹配中括號中任意一個字符 |
[-] |
匹配中括號中任意一個字符,-代表範圍 |
[^] |
匹配不是中括號中的一個字符 |
11.4
符號 |
作用 |
‘’ |
單引號。在單引號中所有的特殊符號,如$和`都沒有特殊含義 |
“” |
雙引號,在雙引號裏特殊符號都沒有特殊含義,但是 $ ` \ 例外,擁有調用變量值,引用命令和轉義的含義 |
` |
反引號,擴起來的是系統命令 |
$() |
和反引號一樣 |
# |
在shell腳本中,#開頭的行代表註釋 |
$ |
用於調用變量的值 |
\ |
轉義符號 |
- 這裏的單引號和雙引號類似php
- 單引號裏如果有變量,不解析
- 雙引號裏如果有變量,會解析
- 舉例:
```
name=yuhua
myname='$name_10'
echo myname //得到的是$name_10字符串
myname2="$name-10"
echo myname2 //得到的是yuhua-10
```
- 這裏的反引號代表執行的意思($()與反引號效果一模一樣)
- 舉例:
```
files="`ls`"
echo $files //會先得到ls,發現ls是帶反引號的,則執行這個ls,得到的就是執行命令ls的結果
```
- a=`ls`
- b=$(ls)