shell是一個命令行解釋器,它爲用戶提供了一個向Linux內核發送請求以便運行程序的界面系統級程序,用戶能夠用shell來啓動、掛起、中止甚至是編寫一些程序。linux
shell 仍是一個功能強大的編程語言,易編寫,易調試,靈活性強。shell是解釋型的腳本語言。在shell中能夠直接調用Linux系統命令。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
查看/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 ~]#
命令格式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格式。
歷史命令
命令格式:
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 ~]#
命令執行時順序
第一順位執行用絕對路徑或相對路徑執行的命令
第二順位執行別名
第三順位執行Bash的內部命令
第四順位執行按照$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 ~]#
快捷鍵 | 做用 |
---|---|
Ctrl+A |
把光標移動到命令行開頭。 |
Ctrl+E |
光標移動到命令行結尾 |
Ctrl+C |
強制終止當前的命令 |
Ctrl+L |
清屏,至關於clear 命令 |
Ctrl+U |
刪除或剪切光標以前的命令 |
Ctrl+K |
刪除或剪切光標以後的內容 |
Ctrl+Y |
粘貼Ctrl+U 或Ctrl+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的方式獲得變量的值 |
\ | 轉義符,跟在以後的特殊符號將失去特殊含義。如$將輸出"$"符號,而不當作變量引用 |
範例:
[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]#