一、shell基礎介紹:shell
shell是一個命令解釋器,用於用戶與機器的交互:vim
也支持特定的語法(邏輯判斷,循環):bash
每一個用戶都有本身特定的shell:Centos7的shell是bash(bourne agin shell):less
shell還有zsh ksh這兩種:spa
二、命令歷史: history code
命令歷史存放路徑:用戶的家目錄:用history命令能夠查看命令歷史:內存
[root@localhost ~]# ls -ld /root/.bash_history #命令歷史所在的家目錄 -rw------- 1 root root 13038 Jun 30 22:36 /root/.bash_history [root@localhost ~]# history #可直接查看系統中命令歷史 994 yum list |grep zsh 995 cat .bash_history 996 ls -ld /root/.bash_history 997 history 998 cat .bash_history 999 history 1000 exit 1001 clear 1002 history 1003 history |tail -10
2.1:history能夠存放1000條命令的數目:是有環境變量HISTSIZE決定的:ci
[root@localhost ~]# echo $HISTSIZE 1000
注:有時超過1000條後再寫入時則暫時存在於內存中,當正常退出終端後才寫入到文件:it
2.2:history -c :只清空當前內存中的命令,不會清除配置文件中的歷史命令:io
[root@localhost ~]# history #第一次看出命令歷史記錄 1001 clear 1002 history 1003 history |tail -10 1004 echo $HISTSIZE 1005 history |tail -10 1006 history |tail -6 [root@localhost ~]# history -c #清除當前內存的命令歷史 [root@localhost ~]# history #再次查看則沒有歷史記錄,當從新開啓終端後,則再次顯示: 8 history
2.3:history命令歷史的顯示數目可定義:以下:
[root@localhost ~]# vim /etc/profile #編輯此配置文件: [root@localhost ~]# cat /etc/profile |grep -C3 HISTSIZE fi HOSTNAME=`/usr/bin/hostname 2>/dev/null` HISTSIZE=5000 #修改此命令條目爲5000: if [ "$HISTCONTROL" = "ignorespace" ] ; then export HISTCONTROL=ignoreboth else export HISTCONTROL=ignoredups fi [root@localhost ~]# echo HISTSIZE=5000 [root@localhost ~]# source /etc/profile #保存後須要刷新才能生效: [root@localhost ~]# echo $HISTSIZE 再次查看命令歷史: 5000
在/etc/porfile文件裏,搜索關鍵字"HIST"找到HISTSIZE,在此更改其數字,保存退出,而後執行/source /etc/profile命令刷新該配置才能生效:
2.4:更改hsitory的顯示格式: HISTTIMEFORMAT
[root@localhost ~]# HISTTIMEFORMAT="%Y-%m-%d %H-%M-%S " #直接給變量賦值便可: [root@localhost ~]# history |tail -4 #按年月日來顯示: 1023 2018-07-04 11-39-25 history 1024 2018-07-04 11-39-33 HISTTIMEFORMAT="%Y-%m-%d %H-%M-%S " 1025 2018-07-04 11-39-35 history 1026 2018-07-04 11-39-40 history |tail -4 [root@localhost ~]# su - yuanhh #切換到另外一個普通用戶: Last login: Wed Jul 4 11:28:53 CST 2018 on pts/1 [yuanhh@localhost ~]$ history #則不顯示: 1 history \ 2 history 3 echo $HISTSIZE 4 EXIT 5 exit 6 history
如上:修改命令歷史的格式直接給其變量賦值便可,不過該格式只適用於當前終端,若是要其使用與全部用戶,則須要寫入到history的配置文件纔會生效:
[root@localhost ~]# vim /etc/profile #修改此文件 HOSTNAME=`/usr/bin/hostname 2>/dev/null` HISTTIMEFORMAT="%Y-%m-%d %H-%M-%S" #新增添加這一行了: HISTSIZE=5000 if [ "$HISTCONTROL" = "ignorespace" ] ; then [root@localhost ~]# ^C [root@localhost ~]# source /etc/profile [root@localhost ~]# su - yuanhh #切換到普通用戶查看: Last login: Wed Jul 4 11:37:41 CST 2018 on pts/0 [yuanhh@localhost ~]$ history #命令歷史顯示格式發生變化: 1 2018-07-04 11-46-54history \ 2 2018-07-04 11-46-54history 3 2018-07-04 11-46-54echo $HISTSIZE 4 2018-07-04 11-46-54EXIT
2.5:命令歷史永久保存:命令歷史只能寫入不能刪除:
[root@localhost ~]# chattr +a /root/.bash_history [root@localhost ~]# lsattr /root/.bash_history -----a-------e-- /root/.bash_history
給文件增長+a權限,只能追加,不能刪除:也僅僅root用戶能夠操做:
三、!!命令:
!!:兩個歎號表示當前命令歷史中的最後一條命令:等同與上翻按鍵:
!n:n等於數字,表示命令歷史中的第n條命令:
!word:表示命令歷史中以該word命令開頭的命令:
[root@localhost ~]# pwd /root [root@localhost ~]# !! pwd /root
1033 2018-07-04 11-59-01ls 1034 2018-07-04 11-59-06pwd 1035 2018-07-04 11-59-56history [root@localhost ~]# !1033 #表示第1033條命令: ls [root@localhost ~]# !p #表示以p開頭的命令: pwd /root
四、命令補全和別名: tab alias unalias
tab:補全命令:須要安裝包:bash-completion 並從新啓動系統便可:
按一次tab:補全一個命令或者參數:
按兩次tab:補全某字母開頭的全部命令及文件名:
4.1:命令別名:alias unalias
alias 命令別名="具體的命令" #設置別名:
unalias 命令別名 #取消別名:
[root@localhost ~]# alias p="pwd" #設置別名」pwd「: [root@localhost ~]# p /root [root@localhost ~]# unalias p #取消別名: [root@localhost ~]# p -bash: p: command not found
4.2:輸入"alias"可查看系統中全部的別名:
[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'
4.2:系統別名的存放在配置文件~/.bashrc和/etc/profile.d/下:
[root@localhost ~]# cat ~/.bashrc #當前用戶下.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
[root@localhost ~]# ls /etc/profile.d/ 256term.csh colorls.csh less.sh 256term.sh colorls.sh vim.csh bash_completion.sh lang.csh vim.sh colorgrep.csh lang.sh which2.csh colorgrep.sh less.csh which2.sh
當前用戶目錄下的.bashrc只對當前用戶生效:
/etc/profile.d/目錄下的針對於系統中全部用戶生效:
五、通配符: * ? [ ] { }
*:表示匹配零個或多個字符:
?:表示匹配一個字符:
[ ]:表示匹配一個範圍,中括號區間內的任意一個文件:
{ }:表示匹配花括號內的任意一個文件:
[root@localhost ~]# ls 1.txt 2.txt 3.txt ba.txt.c cat.txt dir1 pk.txt [root@localhost ~]# ls *.txt #"*"匹配一個或者多個文件: 1.txt 2.txt 3.txt cat.txt pk.txt [root@localhost ~]# ls *txt* 1.txt 2.txt 3.txt ba.txt.c cat.txt pk.txt
[root@localhost ~]# ls 1.txt 2.txt 3.txt ba.txt.c cat.txt dir1 pk.txt [root@localhost ~]# ls ?.txt #」?「只匹配一個字符: 1.txt 2.txt 3.txt
[root@localhost ~]# ls 1.txt 3.txt 5.txt ba.txt.c dir1 2.txt 4.txt 6.txt cat.txt pk.txt [root@localhost ~]# ls [1-5].txt #表示匹配1--5之間的任意.txt文件: 1.txt 2.txt 3.txt 4.txt 5.txt
[root@localhost ~]# ls 1.txt 3.txt 5.txt ba.txt.c dir1 2.txt 4.txt 6.txt cat.txt pk.txt [root@localhost ~]# ls {1,2,3}.txt #匹配花括號內的txt文件: 1.txt 2.txt 3.txt
六、輸入輸出重定向: > >> 2> 2>> &> <
>:輸出重定向:
>>:追加劇定向:
2>:錯誤重定向:
2>>:錯誤追加劇定向:
&>:正確錯誤重定向:
<:輸入重定向:
5.1:使用">"這個命令時會將源文件內容刪除:
[root@localhost ~]# echo "111111" > 1.txt #寫入文件: [root@localhost ~]# cat 1.txt 111111 [root@localhost ~]# echo "222222" > 2.txt #再次重定向寫入文件: [root@localhost ~]# cat 2.txt #會刪除源文件: 222222
使用">>"至關於追加,不刪除源文件內容:
[root@localhost ~]# cat 2.txt 222222 [root@localhost ~]# echo "333333" >> 2.txt #再次追加內容: [root@localhost ~]# cat 2.txt #源文件內容不刪除: 222222 333333
錯誤重定向"2>"和錯誤追加劇定向"2>>":
[root@localhost ~]# lsaaa -bash: lsaaa: command not found [root@localhost ~]# lsaaa 2> 11.txt #錯誤重定向: [root@localhost ~]# cat 11.txt -bash: lsaaa: command not found [root@localhost ~]# ls222 2>> 11.txt #錯誤追加劇定向: [root@localhost ~]# cat 11.txt -bash: lsaaa: command not found -bash: ls222: command not found [root@localhost ~]# ls 2> 11.txt #此時輸入一個正確的命令: 11.txt 2.txt 4.txt 6.txt cat.txt pk.txt 1.txt 3.txt 5.txt ba.txt.c dir1 [root@localhost ~]# cat 11.txt #查看時發現無內容,說明命令正確時是不會被重定向的:
也能夠同時使用重定向和錯誤重定向:
分別寫入到兩個文件1.txt和2.txt:
[root@localhost ~]# ls -ld 1.txt aaa.txt >1.txt 2>2.txt [root@localhost ~]# cat 1.txt #正確的重定向在這裏: -rw-r--r-- 1 root root 0 Jul 5 16:18 1.txt [root@localhost ~]# cat 2.txt #錯誤的重定向在這裏: ls: cannot access aaa.txt: No such file or directory
如上:正確的文件寫入到1.txt裏,錯誤的則寫入到2.txt文件下:
也能夠寫入到同一個1.txt文件裏:
[root@localhost ~]# ls -ld 1.txt aaa.txt &> 1.txt [root@localhost ~]# cat 1.txt #正確和錯誤都輸出到同一個文件裏: ls: cannot access aaa.txt: No such file or directory -rw-r--r-- 1 root root 0 Jul 5 16:23 1.txt #等同於下面的命令: [root@localhost ~]# ls -ld 1.txt aaa.txt > 1.txt 2>&1 #&1:表示前面的1.txt文件: [root@localhost ~]# cat 1.txt ls: cannot access aaa.txt: No such file or directory -rw-r--r-- 1 root root 0 Jul 5 16:24 1.txt
#命令中"&1"表示前面的1.txt文件:
輸入重定向:"<"輸入重定向的左邊必須是一個命令:用的較少:
[root@localhost ~]# wc -l < 1.txt 2