1. Shell概述
1.1 概念
這裏可以分兩個方面來理解:
- 是一個命令行解釋器。它爲用戶提供了一個像Linux內核發送請求以便運行程序的界面系統程序,用戶可以通過shell來啓動、掛起、停止甚至是編寫一些程序。
- shell還是一個功能相當強大的編程語言,易編寫,易調試,靈活性強。Shell是解釋執行的腳本語言,在Shell中可以直接調用Linux系統命令。
1.2 Shell 分類
- Bourne shell:從1979起Unix就開始使用 Bourne Shell,Bourne Shell的主文件名爲 sh。
- C Shell: C Shell主要在BSD版的Unix系 統中使用,其語法和C語言相類似而得名。
- Shell的兩種主要語法類型有Bourne和C, 這兩種語法彼此不兼容。Bourne家族主要包括sh、ksh、Bash、psh、zsh;C家族主 要包括:csh、tcsh
- Bash: Bash與sh兼容,是Linux系統默認使用的Shell。
其實可以這樣理解:Shell是一種編程語言,而Bash是它的語法。
1.3 查看你的Linux所支持的Shell
[cfp@bogon ~]$ cat /etc/shells
2. Shell腳本的執行方式
2.1 echo命令
echo輸出命令:
-e 支持反斜線控制字符轉換
控制字符 | 作用 |
---|---|
\\ | 輸出\本身 |
\a | 輸出警告本身 |
\b | 退格鍵,也就是向左刪除鍵 |
\c | 取消輸出行末的換行符。和“-n”選項一致 |
\e | ESCAPE鍵 |
\f | 換頁符 |
\n | 換行符 |
\r | 回車鍵 |
\t | 製表符 |
\v | 垂直製表符 |
\0nnn | 按照八進制ASCII碼錶輸出字符。其中0爲數字0,nnn是三位八進制 |
\xhh | 按照十六進制ASCII碼錶輸出字符。q其中hh是兩位十六進制數 |
實例:
[root@bogon ~]$ echo -e "ab\bc"
ac
[root@bogon ~]$ echo -e "a\tb\tc\nd\te\tf"
a b c
d e f
[root@bogon ~]$ echo -e "\e[1;31m abcd \e[0m"
abcd #這是紅色的!
#30m=黑色,31m=紅色,32m=綠色,33m=黃色
#34m=藍色,35m=洋紅,36m=青色,37m=白色
2.2 第一個腳本的完整代碼
第一個腳本的完整代碼:輸出hello world
#!/bin/bash
這裏要說明以下,編寫Shell腳本的時候,上面這句代碼是放在腳本開頭的,它不是一句註釋,而是用這個語句來標識以下輸入都是shell腳本。
[root@bogon ~]$ mkdir /tmp/sh #創建一個sh目錄
[root@bogon ~]$ touch /tmp/sh/hello.sh #在sh目錄目錄下創建一個hello.sh文件
[root@bogon ~]$ vi /tmp/sh/hello.sh #編輯這個文件
#!/bin/bash
#name Mrs Chen #這一行是註釋
#Data 2020/3/1 #這一行是註釋
echo "hello world" #輸出hello world
[root@bogon ~]$ bash /tmp/sh/hello.sh
hello world
2.3 腳本執行的方式
腳本的執行一般有兩種方式:
(1) 賦予執行權限,直接運行。分兩步:
- chmod 755 文件名
- 文件絕對路徑或相對路徑
[root@bogon ~]$ chmod 755 /tmp/sh/hello.sh
[root@bogon ~]$ /tmp/sh/hello.sh
hello world
(2) 通過bash調用執行腳本:
- bash 文件絕對路徑或相對路徑
[root@bogon ~]$ bash /tmp/sh/hello.sh
hello world
3.Bash的基本功能
3.1 歷史命令
語法: history [選項] [歷史命令保存文件]
選項:
-c 清空歷史命令
-w 把緩存中的歷史命令寫入歷史命令保存文件.bash_history (在家目錄下)。 ”.“ 表示該文件是隱藏文件
範例:[root@bogon ~]$ history
歷史命令默認會保存1000條,可以在環境配置文件/etc/profile中進行修改:找到“HISTSIZE=1000“這句代碼,將數字修改就行。
歷史命令的調用:
- 使用上下、箭頭調用以前的歷史命令(最常用的方法)
- 使用“!n”重複執行第n條命令,n是用history查詢到的。
- 使用“!!”重複執行上一條命令
- 使用"!字串"重複執行最後一條以該字符串開頭的命令
3.2 命令與文件的補全
在Bash中,命令與文件補全是非常方便與常用的功能,我們只要在輸入命令或文時,按“Tab”鍵就會自動補全。
但這裏要注意的是,如果有多條命令與你所打的相符合,按一下”Tab“鍵沒用。按兩下”Tab“,可以查看與你所打相符合的所有命令,然後自己再選擇。
3.3 Bash常用快捷鍵與命令別名
Bash常用快捷鍵:
快捷鍵 | 作用 |
---|---|
ctrl+a | 把光標移動到命令行開頭 |
ctrl+e | 把光標移動到命令行結尾 |
ctrl+c | 強制終止當前命令 |
ctrl+l | 清屏,相當於clear命令 |
ctrl+u | 刪除或剪切光標之前的命令 |
ctrl+k | 刪除或剪切光標之後的命令 |
ctrl+y | 粘貼ctrl+u或ctrl+k剪切的內容 |
ctrl+r | 在歷史命令中搜索,按下ctrl+r之後,就會出現搜索界面,只要輸入搜索內容,就會從歷史命令中搜索 |
ctrl+d | 退出當前終端 |
命令別名:
命令別名指的是,如過A命令很長、很難記住或者很難打,就把這個命令製作一個別名,以後就使用這個別名來代替A命令。下面是製作方法:
[root@bogon ~]$ alias 別名=‘原命令’ #設定命令別名
[root@bogon ~]$ alias #查詢命令別名
[root@bogon ~]$ unalias 別名 #刪除別名
按照如上步驟,僅僅是在終端沒被關閉之前有效。一旦終端關閉後,上邊的操作都會無效。將設定命令別名的這個命令,加入到這個文件中, 讓別名永久生效。. bashrc是家目錄下面的文件,是一個隱藏文件。
[root@bogon ~]$ vi .bashrc
# .bashrc
alias rm='rm -i'
alias cp='cp -i'
alias mv='mv -i'
# Source global definitions
if [ -f /etc/bashrc ]; then
. /etc/bashrc
fi
PS:設定別名的時候,一定要注意!你要確定別名和系統自帶的一些命令不會重疊!!
3.4 輸入輸出重定向
設備 | 設備文件名 | 文件描述符 | 類型 |
---|---|---|---|
鍵盤 | /dev/sdtin | 0 | 標準輸入 |
顯示器 | /dev/sdtout | 1 | 標準輸出 |
顯示器 | /dev/sdterr | 2 | 標準錯誤輸出 |
輸出重定向,就是將本該輸出在顯示器上的內容,重定向輸出到文件中。輸出重定向很常見,是Linux裏面很重要的一個命令。
標準輸出重定向:
符號 | 作用 |
---|---|
命令 > 文件 | 以覆蓋的方式,把命令的正確輸出輸出到指定文件或設備當中 |
命令 >> 文件 | 以追加的方式,把命令的正確輸出輸出到指定文件或設備當中 |
標準錯誤輸出重定向:
符號 | 作用 |
---|---|
錯誤命令 2> 文件 | 以覆蓋的方式,把命令的錯誤輸出輸出到指定文件或設備當中 |
錯誤命令 2>> 文件 | 以追加的方式,把命令的錯誤輸出輸出到指定文件或設備當中 |
一般上邊兩種不常用。因爲如果可以已經知道命令是錯誤的,改正不就行了?所以就有了下面這個最常用的
正確輸出和錯誤輸出同時保存:
符號 | 作用 |
---|---|
命令 &>文件 | 以覆蓋的方式,把命令的正確輸出、錯誤輸出輸出到指定文件或設備當中 (注意,最後一個“文件”前面沒有空格!!) |
命令 &>>文件 | 以追加的方式,把命令的正確輸出、錯誤輸出輸出到指定文件或設備當中 (注意,最後一個“文件”前面沒有空格!!) |
命令 >> 文件1 2>>文件2 | 把正確的的輸出追加到文件1中,把錯誤的輸出追加到文件2中 (注意,最後一個“文件”前面沒有空格!!) |
實例講解:
[root@bogon ~]$ ls .user &>./text/a.txt #將命令ls .user的結果輸出到文件./text/a.txt中
[root@bogon ~]$ cat ./text/a.txt #查看./text/a.txt文件
ls: cannot access '.user': No such file or directory
輸入重定向,就是將文件中的內容作爲輸入,不再用鍵盤輸入。輸入重定向在Linux中基本用不到,瞭解這個概念就行,主要會使用輸出重定向即可。
3.5 多命令順序執行與管道符
(1)多命令執行順序:
多命令執行符 | 格式 | 作用 |
---|---|---|
; | 命令1 ; 命令2 | 多個命令順序執行,命令之間沒有任何邏輯聯繫 |
&& | 命令1 && 命令2 | 邏輯與,當命令1正確執行,則命令2纔會執行。 |
|| | 命令1 || 命令2 | 邏輯或,當命令1執行不正確,則命令2纔會執行 |
實例講解:
[root@bogon ~]$ ls ; cd /user ; date
Desktop Documents Downloads Music Pictures Public Videos
bash: cd: /user: No such file or directory
Mon 02 Mar 2020 04:50:51 PM CST
#第二行的內容打印的是第一個命令“ls”。第三行的內容是打印第二個命令“cd/user”。
#第四行的內容是打印第三個命令“date”。
[root@bogon ~]$ date ; dd if=/dev/zero of=/root/testfile bs=1k count=100000 ; date
#將/dev/zero中的內容寫入到文件/root/testfile下面,寫入98M大小的數據。
dd 命令:
功能描述:複製文件並對原文件內容進行轉換和格式化處理
語法:dd if=輸入文件 of=輸出文件 bs=字節數 count=個數
選項:
if=輸入文件 指定源文件或源設備
of=輸出文件 指定目標文件或目標設備
bs=字節數 指定一次輸入/輸出多少個字節,即把這些字節看做一個數據塊
count=個數 指定輸入/輸出多少個數據塊
範例:$ date ; dd if=/dev/zero of=/root/testfile bs=1k count=100000 ; date
(2)管道符:
命令格式:[root@bogon ~]$ 命令1 | 命令2
功能描述:命令1的正確輸出作爲命令2的執行對象
[root@bogon ~]$ ll -a /etc/ |more #將命令ll -a /etc/的輸出按頁顯示
[root@bogon ~]$ netstat -an |grep "ESTABLISHED" #在netstst -an命令的輸出中查找字符串“ESTABLISHED“
grep命令:
功能描述:一個強大的文本搜索工具
語法:grep [選項] “搜索內容” 文件名
選項:
-i:忽略大小寫
-n: 輸出行號
-v: 反向查找
--color=auto 搜索出的關鍵字用顏色顯示
範例:$ grep -n "root" /etc/passwd
3.6 通配符與其他特殊符號
Linux中通配符是用來匹配文件名的。通配符的含義和正則表達式的含義比較像,但是有區別。Linux中常見的通配符如下:
通配符 | 作用 |
---|---|
? | 匹配一個任意字符 |
* | 匹配0個或任意多個任意字符,也就是可以匹配任何內容 |
[ ] | 匹配括號中任意一個字符。例如:[abc]代表一定匹配一個字符,或者是a,或者是b,或者是c |
[ - ] | 匹配括號中任意一個字符,- 代表一個範圍,例如:[a-z]代表匹配一個小寫字母 |
[ ^ ] | 邏輯非,表示匹配不是括號內的一個字符。例如:[^0-9]代表匹配一個不是數字的字符 |
通配符的實例如下:
[cfp@bogon ~]$ touch abc #在家目錄下創建一個abc文件
[cfp@bogon ~]$ touch abcd #在家目錄下創建一個abcd文件
[cfp@bogon ~]$ touch 012
[cfp@bogon ~]$ touch 0abc
[cfp@bogon ~]$ ls ?abc #在家目錄下搜索一個文件名爲:任一字符+abc 的文件
0abc
[cfp@bogon ~]$ ls [0-9]*
012 0abc
[cfp@bogon ~]$ ls *abc
0abc aabc abc
Bash中其他特殊符號
符號 | 作用 |
---|---|
‘ ’ | 單引號。在單引號中所有的特殊符號,如“$”和"`"(反引號)都沒有特殊含義 |
" " | 雙引號。在雙引號中特殊符號都沒有特殊含義,但是“$”、"`"、"\"是例外,擁有“調用變量的值”、“引用命令”、“轉義符”的特殊含義 |
`` | 反引號。反引號括起來的內容是系統命令,在Bash中會先執行它。和(),因爲反引號非常容易看錯 |
$() | 和反引號一樣,用來引用系統命令 |
# | 在Shell腳本中,#開頭的行代表註釋 |
$ | 用於調用變量的值,如果需要調用變量name的值時,需要用$name的方式得到變量的值 |
\ | 轉義符,跟在\之後的特殊符號將失去特殊符號含義,變爲普通字符 |
特殊符號的實例如下(按着例子來理解特殊符號的含義):
[cfp@bogon ~]$ name=sc
[cfp@bogon ~]$ echo name
name
[cfp@bogon ~]$ echo $name
sc
[cfp@bogon ~]$ echo $(date)
Tue 03 Mar 2020 03:43:30 PM CST
[cfp@bogon ~]$ echo date
date
[cfp@bogon ~]$ echo "$(date)" #雙引號
Tue 03 Mar 2020 03:45:00 PM CST
[cfp@bogon ~]$ echo '$(date)' #單引號
$(date)
[cfp@bogon ~]$ echo `date` #反引號
Tue 03 Mar 2020 03:43:53 PM CST
4.總結
文章簡單介紹了Shell的概念以及一些常見的用法。原理+實例,讓讀者能更容易理解,更容易記住。本篇文章只是Shell的起步文章,後面會接着更新Shell編程和其他的一些Shell基礎性內容。