bash簡介:
bash是衆多shell中最常用的一種,許多linux發行版將bash設置爲默認shell。bash是一種命令解釋型語言,是操作系統給用戶提供的一種接口,能夠將用戶標準輸入或文件中的命令提交內核執行。
bash基礎特性:
1、變量
編程程序語言:
強類型:
定義變量時必須指定類型,參與運算必須符合類型要求,調用爲聲明
弱類型:
無需指定類型,默認均爲字符型,參與運算會自動進行隱式類型轉換
注:bash爲弱類型語言
bash中的變量的種類,根據變量的生效範圍:
本地變量:生效範圍爲當前shell進程,對當前shell之外的其他shell包括當前shell的子shell均無效
環境變量:對當前shell及子shell都有效;(對其他shell無效)
局部變量:生效範圍爲當前sehll進程中某代碼片段(通常指函數)
位置變量:$1,$2,$3,...用於在命令行給腳本傳遞的參數
特殊變量:$?, $0, $*, $#, $@,$$
本地變量
變量賦值:name='value',可以使用引用賦值:
(1)可以使直接字符串
(2)變量引用:name=$var_name
(3)命令引用:name=`COMMAND`, name=$(COMMAND)
變量引用:${name} , $name
${name}’s
"":弱引用,其中的變量名會被替換成變量值;
'':強引用,其中的變量引用不會被替換成變量值,而保持原字符串;
set:顯示已定義的所有變量
unset var_name:銷燬變量
環境變量:
變量聲明及賦值:
export name=value
declare -x name=value
變量引用:$name,$(name)
顯示所有環境變量
export
env
printenv
銷燬:
unset name
變量命名法則:
1、不能使用程序中的關鍵字
2、只能使用數字、字母及下劃線,且不能以數字開頭
3、見名知義,駝峯法則或下劃線
只讀變量:(不能被修改,不能銷燬,只能等到shell進程結束)
readonly name
或 declare -r name
位置變量:在腳本代碼中調用通過命令行傳遞給腳本的參數
$1,$2,...:對應調用第1、第2等參數
shift [n]:左移當前的位置參數,不加參數默認向左移動一位
$0: 腳本本身的名稱
$*:傳遞給腳本的所有參數(把所有參數當做一個字符串)
$@:傳遞給腳本的所有參數(每一個參數都是一個單獨個體)
$#:參數的個數
$$:是腳本運行的當前進程ID號
2、history管理命令歷史
登錄shell時,會讀取命令歷史文件~/.bash_history記錄下的命令;登錄進shell後重新執行的
命令只 會記錄在緩存中,這些命令會在用戶退出時追加記錄到命令歷史文件中(或者使用-a選項)。
history常用選項:
-d OFFSET:根據序列號刪除歷史中指定的命令
-c:清空歷史文件
-a:追加本次會話新執行的命令歷史列表到歷史文件.bash_history中
快捷操作:
!#:調用歷史中第#條命令
!string:調用歷史中最近一個以string開頭的命令
!!:執行上一條命令
!$:調用上一條命令的最後一個參數
快捷鍵:ESC, . 或者alt + .
相關環境變量:
HISTFILE: ~/.bash_history(用戶家目錄)
HISTSIZE:命令歷史記錄的條數,即history所能顯示命令的最多條數。
HISTFILESIZE:命令歷史文件所能記錄的最多歷史命令條數
HISTCONTROL:控制命令歷史記錄方式
ignoredups: 忽略重複的命令,連續且相同方爲"重複"(bash默認)
ignorespace:忽略所有以空白開頭的命令
ignoreboth:包含ignoredups和ignorespace
修改環境變量值方式:export 變量名='值'
變量賦值:把賦值符號後面的數據存儲於變量名
hash:緩存(記錄)用戶的歷史命令路徑到內存中,實現系統加速,只記錄外部命令路徑
[root@localhost man]# hash hits command 5 /bin/grep 1 /bin/egrep 1 /usr/bin/head 3 /bin/cat 4 /usr/bin/man
hash -r:刪除某條命令的緩存記錄
注意:當命令的路徑修改之後,需要刪除此條命令的緩存記錄,否則會報錯,提示找不到此命令
3、命令及路徑補全(Tab鍵)
命令補全:bash根據PATH環境變量定義的路徑,自左而右在每個路徑搜尋命令名命名的文件,返回第一次找到的命令。
4、命令行展開
~:展開爲用戶的主目錄
~USERNAME:展開爲指定用戶的主目錄
{}:可承載一個以逗號分隔的列表,並將其展開爲多個路徑
5、命令的執行結果狀態,兩類:
1、程序的返回值
2、程序的執行狀態結果
bash使用特殊變量$?保存最近一條命令的執行狀態結果:
0:成功
1 - 255:失敗
6、命令別名(alias)
(1) alias
顯示當前shell進程所有可用的命令別名
(2) alias NAME='VALUE'
注意:在命令行中定義的別名,僅對當前的shell進程有效;
僅對當前用戶生效(永久):~/.bashrc
對所有用戶生效(永久):/etc/bashrc
bash進程重新讀取配置文件,立即生效:
source /etc/bashrc
. /etc/bashrc
刪除別名:
unalias NAME
注意:如果別名同原命令的名稱一樣,如果要執行原命令,則用"\COMMAND"
7、glob(globbing)
bash中用於實現文件名"通配"
通配符:
* : 任意長度的任意字符
?:一個任意字符
[]: 匹配指定範圍內的任意單個字符
[0-9]
[a-z]:不區分字符大小寫,區分用[[:lower:]]
[A-Z]:不區分字符大小寫,區分用[[:upper:]]
[^]:匹配指定範圍外的任意單個字符,[^0-9]
專用字符集合:
[:digit:]:數字
[:lower:]:小寫字母
[:upper:]:大寫字母
[:alpha:]:字母
[:alnum:]:字母及數字集合
[:space:]:空格
[:punct:]:標點符號
8、bash的I/O重定向及管道
打開的文件都有一個fd:file description(文件描述符)
標準輸入: keyboard,0
標準輸出: monitor, 1
標準錯誤輸出:monitor, 2
I/0重定向:改變標準位置
輸出重定向:COMMAND > NEW_POS, COMMAND >> NEW_POS
>: 覆蓋重定向
>>: 追加重定向
set -C: 禁止將內容覆蓋輸出到已有文件中
強制覆蓋:>|
set +C:取消禁止
2>: 覆蓋重定向錯誤輸出流
2>>:追加
標準輸出和錯誤輸出各自定向至不同位置:
COMMAND > /path/to/file.out 2> /path/to/error.out
合併標準輸出和錯誤輸出爲同一個數據流進行重定向:
&> :覆蓋
COMMAND > /path/to/file.out 2>&1
&>> :追加
COMMAND >> /path/to/file.out 2>&1
輸入重定向:<
tr:轉換或刪除字符
tr [OPTION]... SET1 [SET2]
tr abc ABC < /etc/fstab
-d:給定刪除字符
HERE DOCUMENT:<<
cat << EOF
cat > /path/to/somefile << EOF
[root@localhost ~]# cat > /tmp/test.out << EOF > Hello > World > EOF
[root@localhost ~]# cat /tmp/test.out Hello World
管道:
echo $PATH | tr 'abc' 'ABC'
tee命令:read from standard input and write to standard output and files
-a,--append:追加
echo $PATH | tr 'a-z' 'A-Z' | tee /tmp/path.out
bash配置配置文件:
按生效範圍劃分:存在兩類:
全局配置:
/etc/profile
/etc/profile.d/*.sh
/etc/bashrc
個人配置:
~/.bash_profile
~/.bashrc
按功能劃分,存在兩類:
profile類:爲交互式登錄的shell提供配置
全局:/etc/profile, /etc/profile.d/*.sh
個人: ~/.bash_profile
功能:
(1)用於定義環境變量
(2)運行命令或腳本
bashrc類:爲非交互式登錄的shell提供配置
全局:/etc/bashrc
個人:~/.bashrc
功用:
(1)定義命令別名
(2)定義本地變量
shell登錄:
交互式登錄:
直接通過終端輸入賬號密碼登錄;
使用"su - UserName"或"su -l Username"切換的用戶
讀取配置文件的順序流程:
/etc/profile --> /etc/profile.d/*.sh --> ~/.bash_profile --> ~/.bashrc --> /etc/bashrc
非交互式登錄:
su UserName
圖形界面下打開的終端
執行腳本
讀取配置文件的順序流程:
~/.bashrc --> /etc/bashrc --> /etc/profile.d/*.sh
編輯配置文件定義的新配置的生效方式:
(1)重新啓動shell進程
(2)使用source或.命令
終端:
用戶與主機交互
物理終端:直接接入本機的顯示器和鍵盤設備,console
虛擬終端:附加在物理終端之上的以軟件方式虛擬實現的終端,Centos 6 默認有6個
ctrl + alt + f1-6
設備文件路徑:/dev/tty#
圖形終端:附加在物理終端之上的以軟件方式虛擬實現的終端,
ctrl + alt + f7
模擬終端:圖形界面下打開的命令行接口,基於ssh協議或telnet協議等遠程方式打開的界面
設備文件:/dev/pts/# [0,∞]
交互式接口:啓動終端後,在終端設備附加一個交互式應用程序
GUI:
X protocol ,window manager,desktop
Desktop:
GNOME(c , gtk)
KDE (C++,qt)
XFCE(輕量級桌面)
CLI:
shell程序:
sh(bourn)
csh
ksh(korn)
bash(bourn again shell),GPL
zsh
命令提示符:prompt
[root@localhost ~]# echo $PS1
[\u@\h \W]\$
prompt:
管理員:#
普通用戶:$
查看當前用戶默認shell:
[root@localhost ~]# echo $SHELL /bin/bash
查看系統所有可用的shell:
[root@localhost ~]# cat /etc/shells /bin/sh /bin/bash /sbin/nologin /bin/dash /bin/tcsh /bin/csh
bash的快捷鍵:
Ctrl + l:清屏
Ctrl + a:跳轉至命令開始處
Ctrl + e:跳轉至命令結尾處
Ctrl + c:取消命令的執行
Ctrl + u:刪除命令行首至光標所在處的所有內容
Ctrl + k:刪除光標所在處至命令行尾的所有內容