什麼是shell?html
shell是系統跟計算機硬件交互時使用的中間介質,它只是系統的一個工具。(造成比喻:用戶直接面對的不是計算機硬件面是shell,用戶把指令告訴shell,而後shell再傳輸給系統內核,接着內核再去支配計算機硬件去執行各類操做)python
一、shell是一個命令解釋器,提供用戶和機器之間的交互 好比咱們登陸的終端可以讓咱們運行命令查看結果,這就是一個shell。linux
二、支持特定語法,好比邏輯判斷、循環、for等正則表達式
三、每一個用戶均可以有本身特定的shellshell
四、CentOS7默認shell爲bash(Bourne Agin Shell,Bourne是一個用戶的名字,爲了記念他,把他開發shell叫作Bourne shell,後來在這個基礎上優化開發,造成一個新的shell,叫作bash shell,也就是在centos7下使用的這個bash shell)vim
五、除了bash shell還有zsh、ksh等,用起來跟bash差很少,但有些細節上差別,好比一些特性的差別。centos
查看系統是否有安裝zsh、ksh,若是沒有能夠yum安裝一下,示例以下bash
[root@aminglinux-01 ~]# yum list |grep zsh zsh.x86_64 5.0.2-25.el7 installed autojump-zsh.noarch 22.3.0-3.el7 epel zsh.x86_64 5.0.2-28.el7 base zsh-html.x86_64 5.0.2-28.el7 base zsh-lovers.noarch 0.9.0-1.el7 epel [root@aminglinux-01 ~]# yum list |grep ksh ksh.x86_64 20120801-34.el7 base mksh.x86_64 46-5.el7 base python-XStatic-Rickshaw.noarch 1.5.0.0-4.el7 epel python-moksha-common.noarch 1.2.3-2.el7 epel python-moksha-hub.noarch 1.5.3-2.el7 epel python-moksha-wsgi.noarch 1.2.2-2.el7 epel
一、history命令 #查看以前使用的命令。 二、.bash_history #存儲使用過的命令文件,在root的家目錄下 三、最大1000條 #存儲使用命令的最大數,在/etc/profile文件裏更改數值 四、變量HISTSIZE #查看命令 echo $HISTSIZE 五、/etc/profile中修改HISTSIZE最大保存數,source保存 六、HISTTIMEFORMAT="%Y/%m/%d %H:%M:%S " #永久生效把這條命令添加到/etc/profile裏 七、永久保存 chattr +a ~/.bash_history 八、!! #執行上一條命令 九、!n #n表示數字,好比:!176, 這樣它就會執行命令歷史裏的176這條命令 十、!echo #echo表示在命令歷史裏從下往上找以echo開頭的第一條命令執行它。
示例以下less
一、.bash_history文件工具
#命令歷史保存在root的家目錄下.bash_history文件中 [root@aminglinux-01 ~]# ls /root/.bash_history /root/.bash_history
二、history命令
#查看以前歷史使用的命令。 [root@aminglinux-01 ~]# history 1 ls -l /tmp/ 2 ls -l ...... 585 ls /root/.bash_history 586 cat /root/.bash_history 587 history
三、echo $HISTSIZE 顯示存放最大多少條歷史記錄
#history存儲使用命令的最大數1000條,變量HISTSIZE [root@aminglinux-01 ~]# echo $HISTSIZE 1000
四、history –c清空內存中的歷史記錄;不會清除.bash_history文件中的記錄
#清空當前命令歷史記錄 [root@aminglinux-01 ~]# history -c [root@aminglinux-01 ~]# history 1 history #查看是否清空了配置文件命令,沒有,只能清空當前命令歷史的。 [root@aminglinux-01 ~]# cat .bash_history ls -l /tmp/ ls -l which rm 注意:當前使用的命令並不會直接保存到.bash_history配置文件裏面去,是先存儲在內存裏,只有當你退出終端的時候纔會保存到配置文件裏。
五、定義HISTSIZE值,在配置文件/etc/profile中修改
#環境變量HISTSIZE在/etc/profile文件中搜索HISTSIZE更改命令歷史變量數值 [root@aminglinux-01 ~]# vi /etc/profile 默認值是1000,改爲5000以下: HISTSIZE=5000 #保存退出後查看變動並無生效 [root@aminglinux-01 ~]# echo $HISTSIZE 1000 #更改變量執行source命令 [root@aminglinux-01 ~]# source /etc/profile #查看更改結果 [root@aminglinux-01 ~]# echo $HISTSIZE 5000
六、定義格式:HISTTIMEFORMAT="%Y/%m/%d %H:%M:%S "
看history是隻顯示ID號與具體命令,是否能夠把命令是何時運行的記錄下來,只須要把變量從新賦值就能夠了。
[root@aminglinux-01 ~]# history 1 history 2 cat .bash_history 3 vi /etc/profile 4 echo $HISTSIZE 5 source /etc/profile 6 echo $HISTSIZE 7 history #更改命令歷史格式,只在當前終端生效 [root@aminglinux-01 ~]# HISTTIMEFORMAT="%Y/%m/%d %H:%M:%S " [root@aminglinux-01 ~]# echo $HISTTIMEFORMAT %Y/%m/%d %H:%M:%S [root@aminglinux-01 ~]# history 1 2017/11/14 16:45:35 history 2 2017/11/14 16:46:43 cat .bash_history 3 2017/11/14 17:59:55 vi /etc/profile 4 2017/11/14 18:04:45 echo $HISTSIZE 5 2017/11/14 18:05:12 source /etc/profile 6 2017/11/14 18:05:14 echo $HISTSIZE 7 2017/11/14 18:06:30 history 8 2017/11/14 18:07:10 HISTTIMEFORMAT="%Y/%m/%d %H:%M:%S " 9 2017/11/14 18:07:34 echo $HISTTIMEFORMAT 10 2017/11/14 18:07:57 history #若是想要保存如上history格式效果,就須要進入配置文件加上以下這條變量命令,保存退出。 [root@aminglinux-01 ~]# vim /etc/profile 添加到文件最後面: HISTTIMEFORMAT="%Y/%m/%d %H:%M:%S " [root@aminglinux-01 ~]# source /etc/profile #這樣哪怕再開一個終端這也保存了。 [root@aminglinux-01 ~]# echo $HISTTIMEFORMAT %Y/%m/%d %H:%M:%S
七、給命令歷史文件增長特殊權限
#爲了讓命令歷史永久保存,不想讓其它人去破壞它,能夠給它加一個特殊的a權限,不能刪除,能夠追加。 [root@aminglinux-01 ~]# chattr +a ~/.bash_history [root@aminglinux-01 ~]# lsattr .bash_history -----a---------- .bash_history 注意:若是執行了這條命令後,你並無正常退出終端,就會致使保存的命令不全。
八、!! 連續兩個,!表示執行上一條命令。
[root@xietaolinux3 ~]# lsattr .bash_history -----a---------- .bash_history [root@xietaolinux3 ~]# !! lsattr .bash_history -----a---------- .bash_history
九、!n 這裏的n是數字,表示執行命令歷史中的第n條命令。
[root@xietaolinux3 ~]# history 1 2018/12/17 16:18:32 history 2 2018/12/17 16:30:00 HISTTIMEFORMAT="%Y/%m/%d %H:%M:%S " 3 2018/12/17 16:30:05 echo $HISTTIMEFORMAT 4 2018/12/17 16:30:11 history 5 2018/12/17 16:32:56 vim /etc/profile 6 2018/12/17 16:33:09 source /etc/profile 7 2018/12/17 16:35:10 chattr +a ~/.bash_history 8 2018/12/17 16:35:19 lsatty .bash_history 9 2018/12/17 16:35:25 lsattr .bash_history 10 2018/12/17 16:41:17 history 11 2018/12/17 16:41:33 lsatty .bash_history 12 2018/12/17 16:41:41 history [root@xietaolinux3 ~]# !9 lsattr .bash_history -----a---------- .bash_history
十、!echo 表示執行命令歷史中最近一次以echo開頭的命令。
[root@xietaolinux3 ~]# history 1 2018/12/17 16:18:32 history 2 2018/12/17 16:30:00 HISTTIMEFORMAT="%Y/%m/%d %H:%M:%S " 3 2018/12/17 16:30:05 echo $HISTTIMEFORMAT 4 2018/12/17 16:30:11 history 5 2018/12/17 16:32:56 vim /etc/profile 6 2018/12/17 16:33:09 source /etc/profile 7 2018/12/17 16:35:10 chattr +a ~/.bash_history 8 2018/12/17 16:35:19 lsatty .bash_history 9 2018/12/17 16:35:25 lsattr .bash_history 10 2018/12/17 16:41:17 history 11 2018/12/17 16:41:33 lsatty .bash_history 12 2018/12/17 16:41:41 history 13 2018/12/17 16:41:45 lsattr .bash_history 14 2018/12/17 16:42:52 history [root@xietaolinux3 ~]# !echo echo $HISTTIMEFORMAT %Y/%m/%d %H:%M:%S
一、tab鍵,敲一下,敲兩下(按tab鍵能夠幫咱們補全一個指令,一個路徑或者一個文件名) 二、參數補全,安裝bash-completion ,重啓系統生效 適用於centos7 三、alias別名給命令從新起個名字 四、各用戶都有本身配置別名的文件 ~/.bashrc(存放別名的路徑地址) 五、ls /etc/profile.d/(存放別名的路徑地址) 六、自定義的alias放到~/.bashrc,自定義後別名存放的地址 (永久保存alias別名,把alias信息存到/etc/bashrc裏面或者家目錄下面的.bashrc)
Centos6中tab鍵只能補全自己,不支持參數補全;Centos7中tab鍵支持命令參數補全,須要安裝一個包bash-completion 重啓才能生效。
#使用tab測試補全這條命令參數 [root@aminglinux-01 ~]# systemctl restart network #安裝這個bash-completion庫 [root@aminglinux-01 ~]# yum install -y bash-completion #重啓系統 [root@aminglinux-01 ~]# reboot
alias也是bash所特有的功能之一
#直接執行alias命令會看到目前系統預設的全部別名 [root@aminglinux-01 ~]# 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'
有的時候命令很長,打的時候不方便,效率低,這樣就可使用alias作別名,以下:
#alias別名給命令從新命名 [root@aminglinux-01 ~]# alias restartnet='systemctl restart network.service' [root@xietaolinux3 ~]# 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 restartnet='systemctl restart network.service' alias rm='rm -i' alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde' #設置好的別名命令生效 [root@aminglinux-01 ~]# restartnet #取消設置好的別名,使用命令unalias [root@aminglinux-01 ~]# unalias restartnet #別名命令失效 [root@aminglinux-01 ~]# restartnet -bash: restartnet: 未找到命令
配置alias的文件有哪些呢?舉例以下:
#用戶家目錄下.bashrc文件中只配置了幾個alias [root@xietaolinux3 ~]# cat .bashrc # .bashrc # User specific aliases and functions alias rm='rm -i' alias cp='cp -i' alias mv='mv -i' # Source global definitions if [ -f /etc/bashrc ]; then . /etc/bashrc fi #其餘的不少別名在/etc/profile.d/目錄下,有不少.sh文件中定義 [root@xietaolinux3 ~]# ls /etc/profile.d/ 256term.csh colorgrep.csh colorls.sh less.csh vim.sh 256term.sh colorgrep.sh lang.csh less.sh which2.csh bash_completion.sh colorls.csh lang.sh vim.csh which2.sh #如colorgrep.sh文件中的grep定義的alias [root@xietaolinux3 ~]# cat /etc/profile.d/colorgrep.sh # color-grep initialization /usr/libexec/grepconf.sh -c || return alias grep='grep --color=auto' 2>/dev/null alias egrep='egrep --color=auto' 2>/dev/null alias fgrep='fgrep --color=auto' 2>/dev/null
注意:命令行下的通配不區分大小寫,可是若是是正則表達式就區分了。
• ls *.txt #表示查找.txt通配文件 • ls ?.txt #表示一個任意的字符 • ls [0-9].txt #列出知足條件範圍內的文件 • ls {1,2}.txt #用花括號列出你須要的文件
*用來匹配零個或多個任意字符
[root@aminglinux-01 ~]# ls 111 1_heard.txt.bak 1.txt.bak 2.txt 456 aminglinux 123 1_sorft.txt.bak 234 3.txt aming2 anaconda-ks.cfg [root@aminglinux-01 ~]# ls *.txt 2.txt 3.txt [root@aminglinux-01 ~]# ls *txt 2.txt 3.txt [root@aminglinux-01 ~]# ls *txt* 1_heard.txt.bak 1_sorft.txt.bak 1.txt.bak 2.txt 3.txt [root@aminglinux-01 ~]# ls 1* 1_heard.txt.bak 1_sorft.txt.bak 1.txt.bak 111: 123:
?用來匹配一個字符
[root@aminglinux-01 ~]# ls ?.txt 2.txt 3.txt [root@aminglinux-01 ~]# touch 1.txt [root@aminglinux-01 ~]# ls ?.txt 1.txt 2.txt 3.txt [root@aminglinux-01 ~]# touch a.txt [root@aminglinux-01 ~]# touch bb.txt #bb.txt由於是兩個字符,因此沒有匹配出來 [root@aminglinux-01 ~]# ls ?.txt 1.txt 2.txt 3.txt a.txt
[ ]裏面能夠寫一個範圍,只要是在這個範圍內單個字符都列出來
[root@aminglinux-01 ~]# ls [0-3].txt 1.txt 2.txt 3.txt [root@aminglinux-01 ~]# ls [12].txt 1.txt 2.txt [root@aminglinux-01 ~]# ls [23].txt 2.txt 3.txt [root@aminglinux-01 ~]# ls {1,2}.txt 1.txt 2.txt [root@xietaolinux3 ~]# ls [a-z].txt a.txt [root@xietaolinux3 ~]# ls [0-9a-z].txt 1.txt 2.txt 3.txt a.txt b.txt [root@xietaolinux3 ~]# ls [0-9A-Z].txt 1.txt 2.txt 3.txt b.txt [root@xietaolinux3 ~]# ls [0-9a-zA-Z].txt 1.txt 2.txt 3.txt a.txt b.txt
{ }花括號裏面要用「,」隔開,1.txt或者3.txt;
[root@xietaolinux3 ~]# ls {1,2,3,a}.txt 1.txt 2.txt 3.txt a.txt
輸入重定向用於改變命令的輸入,輸出重定向用於改變命令的輸出。輸出重定向更爲經常使用,它常常用於將命令的結果輸入到文件中,而不是屏幕中。輸入重定向的命令是<,輸出重定向的命令是>。另外還有錯誤重定向2>以及追加劇定向命令>>。
一、 cat 1.txt >2.txt #>它會把命令產生的正確信息輸出到指定文件裏去,刪除以前文件內容重寫。 二、 cat 1.txt >> 2.txt #>>把前面命令輸出內容重定向追加到後面命令裏去,不刪除舊的。 三、ls aaa.txt 2> err #它會把命令產生的錯誤信息輸出到指定文件裏去 四、ls aaa.txt 2>> err #錯誤信息輸出追加劇定向 五、2>與2>>等於&> #&>結合了正確與錯誤 六、 wc -l < 1.txt #查看一個文件的行數 , 把1.txt內容輸入到重定向命令裏面去,得出結果,左邊必須是一條命令,不支持文件到文件。
[root@xietaolinux3 ~]# echo "aannccaa" > 1.txt [root@xietaolinux3 ~]# cat 1.txt aannccaa
[root@xietaolinux3 ~]# echo "aannccaa" >> 1.txt [root@xietaolinux3 ~]# cat 1.txt aannccaa aannccaa
#使用錯誤命令輸出一條錯誤信息 [root@aminglinux-01 ~]# lsaaa -bash: lsaaa: 未找到命令 #保存一條信息到指定文件裏去 [root@aminglinux-01 ~]# lsaaa 2> a.txt #查看結果 [root@aminglinux-01 ~]# cat a.txt -bash: lsaaa: 未找到命令
#追加一次錯誤信息到文件 [root@aminglinux-01 ~]# lsaaa 2>> a.txt #查看結果 [root@aminglinux-01 ~]# cat a.txt -bash: lsaaa: 未找到命令 -bash: lsaaa: 未找到命令
#&>結合正確錯誤信息重定向到一個文件裏去 [root@aminglinux-01 ~]# ls [12].txt aaa.txt &> a.txt #查看結果 [root@aminglinux-01 ~]# cat a.txt ls: 沒法訪問aaa.txt: 沒有那個文件或目錄 1.txt 2.txt
[root@aminglinux-01 ~]# ls [12].txt aaa.txt &>> a.txt [root@aminglinux-01 ~]# cat a.txt ls: 沒法訪問aaa.txt: 沒有那個文件或目錄 1.txt 2.txt ls: 沒法訪問aaa.txt: 沒有那個文件或目錄 1.txt 2.txt
#既有正確也有錯誤的輸出,區分開來保存在指定的文件裏,把正確與錯誤區分開來輸出 [root@aminglinux-01 ~]# ls [12].txt aaa.txt > 1.txt 2>a.txt #正確 [root@aminglinux-01 ~]# cat 1.txt 1.txt 2.txt #錯誤 [root@aminglinux-01 ~]# cat a.txt ls: 沒法訪問aaa.txt: 沒有那個文件或目錄
#把1.txt內容輸入到重定向命令裏面去,得出結果 [root@localhost ~]# wc -l < 1.txt 2 #左邊只能是命令,不能是文件,不支持這樣的寫法。 [root@xietaolinux3 ~]# 2.txt < 1.txt -bash: 2.txt: 未找到命令