Shell 基礎知識--細說linux配套視頻

Shell 基礎歸納

Shell是什麼?

shell是一個命令行解釋器,它爲用戶提供了一個向Linux內核發送請求以便運行程序的界面系統級程序,用戶能夠用shell來啓動、掛起、中止甚至是編寫一些程序。linux

shell 仍是一個功能強大的編程語言,易編寫,易調試,靈活性強。shell是解釋型的腳本語言。在shell中能夠直接調用Linux系統命令。shell

Shell的分類

  • Bourne Shell:從1979年起Unix就開始使用Bourne Shell,Bourne Shell的主文件名爲sh。編程

  • C Shell:C Shell 主要在BSD版的Unix系統中使用,其語法和C語言相相似而得名。vim

  • Shell 的兩種主要語法類型有Bourne和C,這兩種語法彼此不兼容。Bourne家族主要包括sh、ksh、Bash、psh、zsh;C家族主要包括:csh、tcsh。windows

  • Bash:Bash與sh兼容,如今使用的Linux就是使用Bash做爲用戶的基本Shellcentos

Linux 支持的Shell

  • 查看/etc/shells文件,能夠查看linux支持的shell類型緩存

範例:bash

[root@localhost ~]# cat /etc/shells 
/bin/sh
/bin/bash
/sbin/nologin
/usr/bin/sh
/usr/bin/bash
/usr/sbin/nologin
[root@localhost ~]#

Shell腳本的執行方式

echo 輸出命令

命令格式tcp

echo [選項] [輸出內容]

選項編程語言

  • -e :支持反斜線控制的字符轉換

範例:

# 輸出製表符、換行符
[root@localhost ~]# echo -e 'a\tb\tc\nd\te\tf'
a    b    c
d    e    f
[root@localhost ~]# 

# 輸出顏色 \e[1; 表明開啓顏色輸出
# \e[0m 表明結束顏色輸出
# 經常使用的顏色 30m=黑色,31m=紅色,32m=綠色,
# 33m=黃色,34m=藍色,35m=洋紅,36m=青色,37m=白色
[root@localhost ~]# echo -e "\e[1;31m abcd \e[0m"
 abcd # 紅色
[root@localhost ~]#

第一個腳本

範例:

[root@localhost ~]# vim hello.sh
#!/bin/Bash    # 並非註釋,標稱下面的是shell腳本
#The first program
#Author:dyh(E-mail:jiejie_yh@163.com)

echo -e "\e[1;35m hello world \e[0m"

執行:

1.給腳本賦予執行權限,而後用相對路徑或絕對路徑執行

[root@localhost ~]# ll
    總用量 12
    -rw-------. 1 root root 1262 7月  25 18:59 anaconda-ks.cfg
    -rw-r--r--. 1 root root  107 7月  29 22:13 hello.sh
    -rw-r--r--. 1 root root    9 7月  28 11:59 test.txt
    [root@localhost ~]# chmod 755 hello.sh 
    [root@localhost ~]# ./hello.sh 
    hello world 
    [root@localhost ~]# /root/hello.sh 
    hello world

2.經過bash調用腳本執行(該方式不須要執行權限)

[root@localhost ~]# bash hello.sh 
    hello world 
    [root@localhost ~]#

命令:dos2unix

用於在windows中編寫shell腳本格式轉換成unix格式。

Bash的基本功能

歷史命令與命令補全

歷史命令

命令格式:

history [選項] [歷史命令保存文件]

選項:

  • -c:清空歷史命令

  • -w:把緩存中的歷史命令寫入歷史命令保存文件~/.bash_history

範例:

[root@localhost ~]# ll .bash_history 
-rw-------. 1 root root 15053 7月  29 21:28 .bash_history
[root@localhost ~]# pwd
/root
[root@localhost ~]# history -w
[root@localhost ~]# cat .bash_history 
passwd -l jiejie
vim /etc/shadow
passwd -u jiejie
vim /etc/shadow
passwd -l yh
passwd -u yh
echo "12345" | passwd --stdin user1 
echo "12345"|passwd --stdin user1 
echo "123456"|passwd --stdin jiejie 
vim /etc/shadow
clear
...

[root@localhost ~]# history -c
[root@localhost ~]# history 
    1  history 
[root@localhost ~]#

歷史命令默認會保存1000條,能夠在環境變量配置文件/etc/profile中進行修改。

歷史命令的調用:

  • 可使用鍵盤中的上下箭頭調用之前的歷史命令

  • 使用!n 重複執行第n條歷史命令

  • 使用!! 重複執行上一條命令

  • 使用!字符串重複執行最後一條以該字符串開頭的命令

範例:

[root@localhost ~]# history 
1  history 
2  vim /etc/profile
3  history 
[root@localhost ~]# !2
vim /etc/profile
[root@localhost ~]# !!
vim /etc/profile
[root@localhost ~]# service httpd restart
Redirecting to /bin/systemctl restart  httpd.service
[root@localhost ~]# !ser
service httpd restart
Redirecting to /bin/systemctl restart  httpd.service
[root@localhost ~]#

命令的別名與經常使用快捷鍵

命令別名

命令格式:

# 設定命令別名
alias 別名=‘原命令’
# 查詢命令別名
[root@localhost ~]# alias

範例:

[root@localhost ~]# alias vi='vim'
[root@localhost ~]# alias
alias cp='cp -i'
alias egrep='egrep --color=auto'
alias fgrep='fgrep --color=auto'
alias grep='grep --color=auto'
alias l.='ls -d .* --color=auto'
alias ll='ls -l --color=auto'
alias ls='ls --color=auto'
alias mv='mv -i'
alias rm='rm -i'
alias vi='vim'
alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'
[root@localhost ~]#

命令執行時順序

  1. 第一順位執行用絕對路徑或相對路徑執行的命令

  2. 第二順位執行別名

  3. 第三順位執行Bash的內部命令

  4. 第四順位執行按照$PATH環境變量定義的目錄查找順序找到的第一個命令

讓別名永久生效

上面提到的用命令設置別名的方式只會臨時生效,若是須要讓別名永久生效,須要寫入文件/root/.bashrc

刪除別名

[root@localhost ~]# alias
alias cp='cp -i'
alias egrep='egrep --color=auto'
alias fgrep='fgrep --color=auto'
alias grep='grep --color=auto'
alias l.='ls -d .* --color=auto'
alias ll='ls -l --color=auto'
alias ls='ls --color=auto'
alias mv='mv -i'
alias rm='rm -i'
alias vi='vim'
alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'
[root@localhost ~]# unalias vi
[root@localhost ~]# alias
alias cp='cp -i'
alias egrep='egrep --color=auto'
alias fgrep='fgrep --color=auto'
alias grep='grep --color=auto'
alias l.='ls -d .* --color=auto'
alias ll='ls -l --color=auto'
alias ls='ls --color=auto'
alias mv='mv -i'
alias rm='rm -i'
alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'
[root@localhost ~]#

Bash經常使用快捷鍵

快捷鍵 做用
Ctrl+A 把光標移動到命令行開頭。
Ctrl+E 光標移動到命令行結尾
Ctrl+C 強制終止當前的命令
Ctrl+L 清屏,至關於clear命令
Ctrl+U 刪除或剪切光標以前的命令
Ctrl+K 刪除或剪切光標以後的內容
Ctrl+Y 粘貼Ctrl+UCtrl+K剪切的內容
Ctrl+R 在歷史命令中搜索
Ctrl+D 退出當前終端
Ctrl+Z 暫停,並放入後臺
Ctrl+S 暫停屏幕輸出
Ctrl+Q 回覆屏幕輸出

輸入輸出重定向

輸出重定向

類型 符號 做用
標準輸出重定向 命令 > 文件 以覆蓋的方式,把命令的正確輸出輸出到指定的文件或設備當中。
標準輸出重定向 命令 >> 文件 以追加的方式,把命令的正確輸出輸出到指定的文件或設備當中。
標準錯誤輸出重定向 錯誤命令 2> 文件 以覆蓋的方式,把命令的錯誤輸出輸出到指定的文件或設備當中。
標準錯誤輸出重定向 錯誤命令 2>> 文件 以追加的方式,把命令的錯誤輸出輸出到指定的文件或設備當中。
正確輸出和錯誤輸出同時保存 命令 > 文件 2>&1 以覆蓋的方式,把命令的正確輸出和錯誤輸出保存到同一個文件中。
正確輸出和錯誤輸出同時保存 命令 >> 文件 2>&1 以追加的方式,把命令的正確輸出和錯誤輸出保存到同一個文件中。
正確輸出和錯誤輸出同時保存 命令 &>文件 以覆蓋的方式,把命令的正確輸出和錯誤輸出保存到同一個文件中。
正確輸出和錯誤輸出同時保存 命令 &>>文件 以追加的方式,把命令的正確輸出和錯誤輸出保存到同一個文件中。
正確輸出和錯誤輸出同時保存 命令 >>文件1 2>>文件2 把正確的輸出追加到文件1中,把錯誤的輸出追加到文件2中

範例:

# 標準輸出重定向
[root@localhost ~]# ls > abc
[root@localhost ~]# cat abc
abc
anaconda-ks.cfg
hello.sh
test.txt
[root@localhost ~]# date
2017年 07月 30日 星期日 00:35:29 CST
[root@localhost ~]# date > abc
[root@localhost ~]# cat abc
2017年 07月 30日 星期日 00:35:38 CST
[root@localhost ~]# date >> abc
[root@localhost ~]# cat abc
2017年 07月 30日 星期日 00:35:38 CST
2017年 07月 30日 星期日 00:36:12 CST
[root@localhost ~]#

# 標準錯誤輸出重定向
[root@localhost ~]# lst 2>> abc
[root@localhost ~]# cat abc
2017年 07月 30日 星期日 00:35:38 CST
2017年 07月 30日 星期日 00:36:12 CST
-bash: lst: 未找到命令
[root@localhost ~]#

# 正確輸出和錯誤輸出同時保存
[root@localhost ~]# lst >> bcd 2>&1
[root@localhost ~]# cat bcd
-bash: lst: 未找到命令
[root@localhost ~]#

[root@localhost ~]# date &>>cde
[root@localhost ~]# cat cde
2017年 07月 30日 星期日 00:48:27 CST
[root@localhost ~]# datesf &>>cde
[root@localhost ~]# cat cde
2017年 07月 30日 星期日 00:48:27 CST
-bash: datesf: 未找到命令
[root@localhost ~]# 

[root@localhost ~]# ls &>>/dev/null # 特殊文件,不存在,垃圾箱。不保存任何數據

[root@localhost ~]# ls >> def 2>>efg
[root@localhost ~]# cat def
abc
anaconda-ks.cfg
bcd
cde
def
efg
hello.sh
test.txt
[root@localhost ~]# cat efg
[root@localhost ~]#

輸入重定向

命令格式:

wc [選項] [文件名]

選項:

  • -c:統計字節數

  • -w:統計單詞數

  • -l:統計行數

範例:

[root@localhost ~]# wc
1111111 22221  12
12323
343
12
      4       6      31
[root@localhost ~]#

[root@localhost ~]# wc < abc 
  3  15 114
[root@localhost ~]# 

[root@localhost ~]# wc <<hello
> ksdfk
> 12
> 324
> 34543
> hello
 4  4 19
[root@localhost ~]#

多命令順序執行與管道符

多命令順序執行

多命令執行符號 格式 做用
; 命令1; 命令2 多個命令順序執行,命令之間沒有任何邏輯聯繫
&& 命令1&&命令2 邏輯與。當命令1正確執行,則命令2纔會執行。當命令1執行不正確,則命令2不會執行
|| 命令1|| 命令2 邏輯或。當命令1執行不正確,命令2纔會執行。當命令1正確執行,則命令2不會執行

範例:

[root@localhost ~]# ls;date;cd /user;pwd
abc  anaconda-ks.cfg  bcd  cde  def  efg  hello.sh  test.txt
2017年 07月 30日 星期日 01:30:26 CST
-bash: cd: /user: 沒有那個文件或目錄
/root
[root@localhost ~]#

dd 命令

dd命令是linux中進行磁盤複製或者說數據複製,cp命令只能複製文件,dd命令能複製特殊命令、特殊文件,甚至整個硬盤。不光復制分區或者硬盤的數據,也能複製分區或者硬盤的文件系統。

命令格式:

dd if=輸入文件 of=輸出文件 bs=字節數 count=個數

選項:

  • if=輸入文件 指定源文件或源設備

  • of=輸出文件 指定目標文件或目標設備

  • bs=字節數 指定一次輸入/輸出多少字節,即把這些字節看作一個數據塊

  • count=個數 指定輸入/輸出多少個數據塊

範例:

[root@localhost ~]# date;dd if=/dev/zero of=/root/testfile bs=1k count=100000;date
2017年 07月 30日 星期日 01:40:11 CST
記錄了100000+0 的讀入
記錄了100000+0 的寫出
102400000字節(102 MB)已複製,0.195148 秒,525 MB/秒
2017年 07月 30日 星期日 01:40:11 CST

[root@localhost ~]# ll -h
總用量 98M
-rw-r--r--. 1 root root  114 7月  30 00:38 abc
-rw-------. 1 root root 1.3K 7月  25 18:59 anaconda-ks.cfg
-rw-r--r--. 1 root root   42 7月  30 00:47 bcd
-rw-r--r--. 1 root root   74 7月  30 00:48 cde
-rw-r--r--. 1 root root   54 7月  30 01:09 def
-rw-r--r--. 1 root root    0 7月  30 01:09 efg
-rwxr-xr-x. 1 root root  107 7月  29 22:22 hello.sh
-rw-r--r--. 1 root root  98M 7月  30 01:40 testfile
-rw-r--r--. 1 root root    9 7月  28 11:59 test.txt
[root@localhost ~]#

管道符

命令格式:

# 命令1的正確輸出做爲命令2的操做對象
命令1 | 命令2

範例:

[root@localhost ~]# ll -a /etc | more
總用量 1236
drwxr-xr-x. 78 root root     8192 7月  29 23:01 .
dr-xr-xr-x. 19 root root      262 7月  28 12:04 ..
-rw-r--r--.  1 root root       16 7月  25 18:58 adjtime
-rw-r--r--.  1 root root     1518 6月   7 2013 aliases
-rw-r--r--.  1 root root    12288 7月  25 19:06 aliases.db
drwxr-xr-x.  2 root root      236 7月  25 18:51 alternatives
-rw-------.  1 root root      541 3月  31 2016 anacrontab
-rw-r--r--.  1 root root       55 11月  5 2016 asound.conf
drwxr-x---.  3 root root       43 7月  25 18:51 audisp
drwxr-x---.  3 root root       83 7月  25 19:05 audit
drwxr-xr-x.  2 root root       22 7月  25 18:51 bash_completion.d
-rw-r--r--.  1 root root     2853 11月  6 2016 bashrc
drwxr-xr-x.  2 root root        6 11月  7 2016 binfmt.d
-rw-r--r--.  1 root root       38 11月 30 2016 centos-release
-rw-r--r--.  1 root root       51 11月 30 2016 centos-release-upstream
drwxr-xr-x.  2 root root        6 11月  6 2016 chkconfig.d
-rw-r--r--.  1 root root     1165 11月 15 2016 chrony.conf
-rw-r-----.  1 root chrony     62 7月  25 19:05 chrony.keys
drwxr-xr-x.  2 root root       21 7月  25 18:50 cron.d
drwxr-xr-x.  2 root root       57 7月  26 23:14 cron.daily
-rw-------.  1 root root        0 3月  31 2016 cron.deny
drwxr-xr-x.  2 root root       22 6月  10 2014 cron.hourly
--More--

[root@localhost ~]# netstat -an | grep ESTABLISHED
tcp        0      0 192.168.60.188:22       192.168.60.235:57322    ESTABLISHED
udp        0      0 192.168.60.188:50066    85.199.214.100:123      ESTABLISHED
udp        0      0 192.168.60.188:35766    193.228.143.23:123      ESTABLISHED
udp        0      0 192.168.60.188:34918    85.199.214.101:123      ESTABLISHED

grep 命令

命令格式:

grep [選項] "搜索內容" 文件名

選項:

  • -i:忽略大小寫

  • -n:輸出行號

  • -v:反向查找

  • --color=auto 搜索出的關鍵字用顏色顯示

範例:

[root@localhost ~]# grep 'root' /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
[root@localhost ~]# grep -n --color=auto "root" /etc/passwd
1:root:x:0:0:root:/root:/bin/bash
10:operator:x:11:0:operator:/root:/sbin/nologin
[root@localhost ~]# grep -i --color=auto "root" /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
[root@localhost ~]# grep -i --color=auto "ROot" /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
[root@localhost ~]#

[root@localhost ~]# netstat -an | grep ESTABLISHED
tcp        0      0 192.168.10.217:22       192.168.10.238:63332    ESTABLISHED
udp        0      0 192.168.10.217:57794    193.228.143.23:123      ESTABLISHED
[root@localhost ~]#

通配符與其它特殊符號

通配符

通配符 做用
? 匹配任意一個通配符
* 匹配0個或任意多個任意字符
[] 匹配括號中任意一個字符。例如:[abc]表明必定匹配一個字符,a/b/c中的其中一個
[-] 匹配中括號中任意一個字符,-表明一個範圍例如:[a-z]
[^] 邏輯非,表示匹配不是中括號內的一個字符。例如:1

範例

[root@localhost ~]# cd /tmp/
[root@localhost tmp]# ll
總用量 12
-rw-rw-r--. 1 yh   yh      0 7月  27 00:01 a
-rwx------. 1 root root  836 7月  25 18:59 ks-script-7AxIKHhttpd.service-RMis7k
drwxrwsrwx. 2 root root   28 7月  28 08:53 test
-rw-------. 1 root root    0 7月  25 18:47 yum.log
[root@localhost tmp]# rm -rf *
[root@localhost tmp]# ll
總用量 0
[root@localhost tmp]# touch abc
[root@localhost tmp]# touch abcd
[root@localhost tmp]# touch 012
[root@localhost tmp]# touch 0abc
[root@localhost tmp]# ls ?abc
0abc
[root@localhost tmp]# ls [0-9]*
012  0abc
[root@localhost tmp]# ls [^0-9]*
abc  abcd
[root@localhost tmp]#

Bash中其餘特殊符號

通配符 做用
'' 單引號。在單引號中全部的特殊符號,如「$」和「`」都沒有特殊含義
"" 雙引號。在雙引號中特殊符號都沒有特殊含義,可是「$」、「`」和「」例外,擁有「調用變量的值」、「引用命令」和」轉義符「的特殊含義
`` 反引號。反引號括起來的內容是系統命令,在Bash中會先執行它。和$()做用同樣
$() 和反引號做用同樣,用來引用系統命令
# 在Shell腳本中,#表明註釋
$ 用於調用變量的值,如須要調用變量name的值時,須要用$name的方式獲得變量的值
\ 轉義符,跟在以後的特殊符號將失去特殊含義。如&dollar;將輸出"$"符號,而不當作變量引用

範例:

[root@localhost tmp]# name=yh
[root@localhost tmp]# echo '$name'
$name
[root@localhost tmp]# echo "$name"
yh
[root@localhost tmp]# echo '$(date)'
$(date)
[root@localhost tmp]# echo "$(date)"
2017年 07月 30日 星期日 06:12:34 CST
[root@localhost tmp]# echo "`date`"
2017年 07月 30日 星期日 06:12:44 CST
[root@localhost tmp]# echo '`date`'
`date`
[root@localhost tmp]#

  1. 0-9
相關文章
相關標籤/搜索