Bash 是 GNU 計劃中重要的工具軟件之一,目前也是 Linux distributions 的標準 shell 。 bash 主要兼容於 sh ,而且依據一些使用者需求,而增強的 shell 版本。不論你使用的是那個 distribution ,你都難逃須要學習 bash 的宿命!那麼這個 shell 有什麼好處,幹嗎 Linux 要使用他做爲默認的 shell 呢? bash 主要的優勢有底下幾個:linux
命令歷史git
命令補全、路徑補全shell
命令替換小程序
命令行展開vim
命令別名緩存
glob通配符bash
bash快捷鍵ssh
bash變量ide
IO重定向與管道函數
1、命令歷史
(1).查看命令歷史:history
-a:追加當前會話的命令歷史至歷史文件中去 -c:清空命令歷史 -d offset [n]:刪除第offset條命令 -w:將當前緩衝區中歷史命令寫入到歷史文件中去 [root@soysauce ~]# history -d 500 10 # 從第五百條命令日後刪10條 [root@soysauce ~]# history 10 # 列出最近10條命令 history 10 1003 history 10 1004 ls 1005 cd /etc/ 1006 cd - 1007 ls /root/ 1008 cd .. 1009 cd /usr/local/ 1010 date 1011 hwclock 1012 history 10
(2). 命令歷史相關的環境變量
HISTSIZE:命令歷史中能夠保存的命令的個數 HISTFILE: 命令歷史文件 HISTFILESIZE:命令歷史文件能夠保存的命令的個數 HISTCONTROL: 控制命令歷史的生成 ignoredups: 忽略記錄重複的命令;連續的相同命令才爲重複 ignorespace: 不記錄以空白字符開頭的命令 ignoreboth: 同時具備上面兩種特性
(3).history快捷方式
!# # 執行命令歷史中的第#條命令 !! # 執行上一條命令 !-# # 執行命令歷史中的倒數第#條命令 !$ # 引用上一條命令最後的參數,另兩種方式:(1)ESC,. # ESC鍵按完以後再按. (2)ALT+. # 按住ALT,再按. !string # 執行命令歷史中最近一條以string開頭的命令
2、命令補全、路徑補全
(1).命令補全
命令補全:搜索PATH環境變量所指定的每一個路徑下以咱們給出的字符串開頭的可執行文件,若是多於一個,兩次tab,能夠給出列表;不然將直接補全 [root@soysauce ~]# Display all 1771 possibilities? (y or n) # 在命令行下連敲兩下Tab鍵便可
(2).路徑補全
路徑補全:搜索咱們給出的起始路徑下的每一個文件名,並試圖補全 [root@soysauce ~]# ls /usr/ # 在命令行下連敲兩下Tab鍵便可,若是能惟一肯定,則敲一下Tab便可 bin/ games/ kerberos/ lib64/ local/ share/ tmp/ etc/ include/ lib/ libexec/ sbin/ src/ X11R6/
3、命令替換
(1). ``(反引號)替換
[root@soysauce ~]# mkdir `date +%F` [root@soysauce ~]# ls 2015-11-06 iptables.sh
(2).$()替換
[root@soysauce ~]# mkdir $(date +%F) [root@soysauce ~]# ls 2015-11-06 iptables.sh
4、命令行展開
當shell遇到{}時會自動將花括號裏面的內容展開爲多個條目
[root@soysauce test]# mkdir {a,b}_{c,d} [root@soysauce test]# ls a_c a_d b_c b_d [root@soysauce test]# cd /etc/yum.repo.d/ [root@soysauce yum.repos.d]# mv CentOS-Base.repo{,.back} # 備份此yum源 [root@soysauce yum.repos.d]# ls CentOS-Base.repo.back
5、命令別名
(1).顯示當前shell中定義的全部別名
[root@soysauce test]# alias alias cp='cp -i' alias fdisk='fdisk -H 224 -S 56' alias l.='ls -d .* --color=tty' alias ll='ls -l --color=tty' alias ls='ls --color=tty' alias mv='mv -i' alias rm='rm -i' alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'
(2).建立命令別名
syntax alias CmdAlias='Command [options] [arguments]' [root@soysauce test]# alias cdnet='cd /etc/sysconfig/network-scripts/' # 定義cdnet別名 [root@soysauce test]# alias alias cdnet='cd /etc/sysconfig/network-scripts/' alias cp='cp -i' alias fdisk='fdisk -H 224 -S 56' alias l.='ls -d .* --color=tty' alias ll='ls -l --color=tty' alias ls='ls --color=tty' alias mv='mv -i' alias rm='rm -i' alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde' [root@soysauce test]# cdnet [root@soysauce network-scripts]#
(3).撤銷別名
[root@soysauce network-scripts]# unalias cdnet [root@soysauce network-scripts]# alias # 此時cdnet這個別名已經被撤銷了 alias cdnet='cd /etc/sysconfig/network-scripts/' alias cp='cp -i' alias fdisk='fdisk -H 224 -S 56' alias l.='ls -d .* --color=tty' alias ll='ls -l --color=tty' alias ls='ls --color=tty' alias mv='mv -i' alias rm='rm -i' alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde' [root@soysauce network-scripts]# cdnet -bash: cdnet: command not found
(4).永久保存此命令別名
[root@soysauce test]# echo "alias cdnet='cd /etc/sysconfig/network-scripts'" >> ~/.bashrc [root@soysauce test]# cdnet # 此時直接使用會提示命令沒找到 -bash: cdnet: command not found [root@soysauce test]# su - # 須要從新打開一個登陸式shell或是從新鏈接才能生效 [root@soysauce test]# cdnet [root@soysauce network-scripts]#
6、Glob通配符
(1). *: 匹配任意長度的任意字符
[root@soysauce test]# touch abc abb abm xab ab Abc [root@soysauce test]# ls ab abb abc abm xab [root@soysauce test]# ls ab* ab abb abc abm
(2). ?:匹配任意單個字符
[root@soysauce test]# ls ab? abb abc abm
(3). []: 匹配指定字符範圍內的任意單個字符
[[:upper:]] 全部大寫字母[A-Z] [[:lower:]] 全部小寫字母[a-z] [[:alpha:]] 全部字母(大小寫)[a-zA-Z] [[:digit:]] 全部數字[0-9] [[:alnum:]] 全部字母和數字[a-zA-Z0-9] [[:space:]] 空白字符 [[:punct:]] 標點符號 [[:blank:]] 空格和製表符 [[:cntrl:]] 控制字符 [[:graph:]] 可打印而且可見的字符(空格可打印,可是不可見) [[:print:]] 可打印字符 [[:xdigit:]] 十六進制數字 [root@soysauce test]# ls [[:upper:]]bc Abc
(4). [^]: 匹配指定字符範圍外的任意單個字符
[root@soysauce test]# ls [^[:upper:]]bc abc
7、bash快捷鍵
Ctrl + a:從光標所在處跳至命令行首 Ctrl + e:從光標所在處跳至命令行尾 Ctrl + u:刪除光標所在處至命令行首的內容 Ctrl + k:刪除光標所在處至命令行尾的內容 Ctrl + w:從光標所在處向前刪除一個單詞 Ctrl + y:將粘貼至光標後 Ctrl + 光標右鍵:向右跳轉一個單詞 Ctrl + 光標左鍵:跳轉一個單詞 Ctrl + c:終止或取消,發送的是SIGINT信號 Ctrl + d:表示一個特殊的二進制值,EOF,可用於終端註銷或提交 Ctrl + s:掛起輸出 Ctrl + z:將當前命令送至後臺(fg調回命令至前臺),發送SIGSTOP信號,fg則是發送SIGCONT信號 Ctrl + l:清屏 Ctrl + r:逆向搜索命令歷史 Alt + .:使用上一條命令的最後一個參數(按住ALT,不鬆開,再按.) ESC + .:同上一個相同(先按一下ESC,鬆開,再按.)
8、Bash變量
1.變量的類型
(1). 本地變量:只對當前shell進程有效,對其子shell以及其它shell都無效
[root@soysauce test]# A='jerry' # 定義一個本地變量A [root@soysauce test]# echo ${#A} # 顯示變量A中字符串長度 5
(2). 局部變量:僅對局部代碼生效(且只能在函數中定義)
[root@soysauce test]# local B='tom' # 命令行不能定義局部變量 -bash: local: can only be used in a function [root@soysauce scripts]# cat local.sh #!/bin/bash # A=1 function test { A=$[3+4] # 此時A爲一個本地變量 } test # 調用此函數test for I in `seq $A 10`; do echo $I done [root@soysauce scripts]# ./local.sh 7 8 9 10 [root@soysauce scripts]# vim local.sh [root@soysauce scripts]# cat local.sh #!/bin/bash # A=1 function test { local A=$[3+4] # 定義A爲局部變量 } test # 一樣調用一次函數test for I in `seq $A 10`; do echo $I done [root@soysauce scripts]# ./local.sh # 能夠看到定義局部變量後,影響的只是局部範圍 1 2 3 4 5 6 7 8 9 10
(3). 環境變量:對當shell進程及其子shell有效
[root@soysauce test]# export C='natash'# 定義環境變量C [root@soysauce test]# echo $C natash [root@soysauce test]# bash # 從新打開一個子shell [root@soysauce test]# echo $C # 以前定義的環境變量在子shell中依然有效,可是從新登錄就沒效了 natash
(4). 位置變量$[1-10]
$1 # 表示向腳本傳遞的第一個參數 $2 # 表示向腳本傳遞的第二個參數
(5). 特殊變量
$0:腳本名稱自身 $#:傳遞到腳本的參數個數 $?:上一條命令的執行狀態返回值,0表明成功 $$:腳本運行的當前shell進程的id號 $!:後臺運行的最後一個進程的進程ID號 $*:以一個單字符串顯示全部向腳本傳遞的參數。與位置變量不一樣,此選項參數可超過9個 $@: 與$*相同,可是使用時加引號,並在引號中返回每一個參數
2.變量命名規則
只能使用數字、字母和下劃線組成
不能以數字開頭
不能使用程序中的關鍵字
見名知義;NameAlias
3.查看變量
(1). 顯示當前系統全部的變量:set
[root@soysauce ~]# set # 篇幅過長,故只截取一部分 BASH=/bin/bash BASH_ARGC=() BASH_ARGV=() BASH_LINENO=() BASH_SOURCE=() BASH_VERSINFO=([0]="3" [1]="2" [2]="25" [3]="1" [4]="release" [5]="x86_64-redhat-linux-gnu") BASH_VERSION='3.2.25(1)-release' COLORS=/etc/DIR_COLORS.xterm
(2). 顯示當前系統全部的環境變量:printenv,env,export
[root@soysauce ~]# printenv # 篇幅過長,故只截取一部分 HOSTNAME=soysauce SHELL=/bin/bash TERM=xterm HISTSIZE=1000 USER=root [root@soysauce ~]# env # 篇幅過長,故只截取一部分 HOSTNAME=soysauce SHELL=/bin/bash TERM=xterm HISTSIZE=1000 USER=root [root@soysauce ~]# export # 篇幅過長,故只截取一部分 declare -x CVS_RSH="ssh" declare -x DISPLAY="localhost:10.0" declare -x G_BROKEN_FILENAMES="1" declare -x HISTSIZE="1000" declare -x HOME="/root" declare -x HOSTNAME="soysauce" declare -x INPUTRC="/etc/inputrc" declare -x LANG="en_US.UTF-8"
4.撤銷變量:unset
[root@soysauce ~]# A='jerry' # 首先定義一個本地變量A [root@soysauce ~]# echo $A # 引用此變量 jerry [root@soysauce ~]# unset A # 撤銷此變量A [root@soysauce ~]# echo $A # 撤銷後,就至關於沒定義,因此值爲不存在
5.bash的配置文件:持久保存用戶配置
(1). profile類:爲交互式登陸的用戶提供配置
/etc/profile 全局 /etc/profile.d/*.sh 全局 ~/.bash_profile 我的配置,僅對當前用戶有效 功能: 設定環境變量 用來實現運行命令或者腳本
(2). bashrc類:非交互式用戶登陸提供配置
/etc/bashrc:全局 ~/.bashrc:我的配置 功能: 設定本地變量 能夠定義命令別名
(3). bash讀取配置文件順序
交互式登陸 如何讀取配置文件
/etc/profile -->/etc/profile.d/*.sh -->~/.bash_profile-->~/.bashrc -->/etc/bashrc
非交互式登陸 如何讀取配置文件
~/.bashrc -->/etc/bashrc -->/etc/profile.d/*.sh
(4). 登錄類型
交互式登陸:直接經過終端輸入用戶信息登錄系統 su - UserName或su -l UserName: 非交互式登陸: su UseName 圖形界面下的終端 執行腳本的時候,先設置配置文件 通知shell重讀系統文件 source(.) 重讀配置文件
9、IO重定向與管道
1.輸入輸出
INPUT:標準輸入,stdin, 0
OUPUT: 標準輸出,stdout, 1
標準錯誤:stderr, 2
2.輸入重定向
<: 輸入重定向 << EOF: 此處建立文件, Here Document,經常使用於在腳本中建立文件或生成菜單 [root@soysauce test]# cat < /etc/issue # cat讀取/etc/issue文件內容,經過輸入重定向 CentOS release 5.8 (Final) Kernel \r on an \m [root@soysauce test]# cat > note.txt << OK # 將鍵盤輸入的內容重定向至note.txt中 > Hello,World > Hello,Python > OK
3.輸出重定向
>: 覆蓋輸出 >>: 追加輸出 set -C:禁止使用覆蓋重定向至已經存在的文件 set +C: 關閉上述特性 >|:在-C特性下,強制使用覆蓋重定向 [root@soysauce test]# ls iptables.sh note.txt [root@soysauce test]# cat /etc/issue >> note.txt # 將issue文件的內容追加劇定向至note.txt尾部 [root@soysauce test]# cat note.txt # 再次查看note.txt的文件內容 Hello,World Hello,Python CentOS release 5.8 (Final) Kernel \r on an \m [root@soysauce test]# cat /etc/fstab > note.txt # 將fstab文件的內容覆蓋重定向至note.txt LABEL=/ / ext3 defaults,barrier=0 1 1 tmpfs /dev/shm tmpfs defaults 0 0 devpts /dev/pts devpts gid=5,mode=620 0 0 sysfs /sys sysfs defaults 0 0 proc /proc proc defaults 0 0 [root@soysauce test]# set -C note.txt # 禁止對此文件使用覆蓋重定向 [root@soysauce test]# cat /etc/issue > note.txt # inittab文件的內容覆蓋重定向至note.txt bash: note.txt: cannot overwrite existing file [root@soysauce test]# cat /etc/issue >| note.txt # 在set -C特性下,強制進行覆蓋重定向 [root@soysauce test]# cat note.txt # 再次查看note.txt的文件內容 CentOS release 5.8 (Final) Kernel \r on an \m [root@soysauce test]# set +C note.txt # 撤銷禁止覆蓋重定向的操做
4.錯誤重定向
2>:錯誤覆蓋輸出 2>>:錯誤追加劇定向 [root@soysauce test]# ls /vars/abc 2>> note.txt # 將此命令執行結果錯誤輸出追加劇定向至note.txt [root@soysauce test]# cat note.txt # 再次查看note.txt的文件內容 CentOS release 5.8 (Final) Kernel \r on an \m ls: /vars/abc: No such file or directory [root@soysauce test]# ls /etc/fsabc 2> note.txt # 將此命令執行結果錯誤輸出覆蓋重定向至note.txt [root@soysauce test]# cat note.txt # 此時文件內容已變成了執行命令產生的錯誤輸出信息 ls: /etc/fsabc: No such file or directory
5.同時重定向標準輸出和標準錯誤輸出
COMMAND > /path/to/outfile 2> /path/to/errfile COMMAND &> /path/to/somefile COMMAND > /path/to/somefile 2>&1 [root@soysauce test]# # 額 之後寫個腳本的時候再舉個例子
6.管道(pipe)
使用目的單一的小程序 組合小程序完成複雜任務 COMMAND1 | COMMAND2 | COMMAND3 | ... [root@soysauce test]# grep "bash" /etc/passwd|head -1|cut -d: -f1 # 取出shell爲bash的用戶列表中第1個 root [root@soysauce test]# seq -s "+" 100|bc # 計算1到100的和,seq用來生成列表,-s選項指定列表分隔符 5050
總結:
~/.bash_history 記錄的是前一次登錄之前所運行過的命令, 而至於這一次登錄所運行的命令都被緩存在內存中,當你成功的註銷系統後,該命令記憶纔會記錄到 .bash_history 當中
定義變量類型的做用①數據存儲格式 ②數據的有限存儲範圍 ③比較機制不一樣 ④參與的運算類型不一樣