Linux學習筆記(15)shell基礎之Bash準系統

來源:互聯網
上載者:User

標籤:

1 shell概述

shell是一個命令直譯器,為使用者提供了一個向Linux核心發送請求以便運行程式的介面系統級程式。使用者可以用shell啟動、掛起、停止甚至是編寫一些程式。

shell是一個功能強大的程式設計語言,其特點是易編寫、易調試及靈活性強。shell是解釋執行的指令碼語言,可直接調用Linux系統命令。

shell通常分為兩類:B shell和C shell。前者的主檔案名為sh,後者主要用於BSD版本的Unix中,其文法格式和C語言類似。這兩種shell的文法彼此間不相容。Bash與sh相容,現在使用的Linux就是使用Bash作為使用者的基本shell。

Linux支援的shell可查看/etc/shells設定檔:

[[email protected] ~]# cat /etc/shells

/bin/sh

/bin/bash

/sbin/nologin

/bin/dash

/bin/tcsh

/bin/csh

可通過輸入其相應命令進行互相轉換,如使用sh:

[[email protected] ~]# sh

sh-4.1#

sh-4.1# exit

exit

[[email protected] ~]#

2 shell指令碼的執行方式

1)echo命令用於輸出資訊,其格式為:

echo [選項] [輸出內容]

其中,-e選項支援反斜線控制的字元轉換。常見的控制字元如下表:

控制字元

作用

\\

輸出\本身

\a

輸出警告音

\b

退格鍵,即向左刪除鍵

\c

取消輸出行末的分行符號,與"-n"選項一致

\e

ESCAPE鍵

\f

換頁符

\n

分行符號

\r

斷行符號鍵

\t

定位字元,即Tab鍵

\v

垂直定位字元

\0nnn

按照八進位ASCII碼錶輸出字元,其中0為數字0,nnn是三位八位元

\xhh

按照十六進位ASCII碼錶輸出子非魚,其中hh是兩位十六進位數

例:刪除左側字元:

[[email protected] ~]# echo -e "abcd\be"

abce

定位字元與分行符號:

[[email protected] ~]# echo -e "a\tb\tc\nd\te\tf"

a       b       c

d       e       f

十六進位ASCII碼輸出:

[[email protected] ~]# echo -e "\x61\t\x62\t\x63\n\x64\t\x65\t\x66"

a       b       c

d       e       f

輸出顏色:

[[email protected] ~]# echo -e "\e[1;31m abcd \e[0m"

 abcd

其中,"\e[1"表示開啟顏色輸出,"\e[0m"表示結束顏色輸出。

30m=黑色 31m=紅色 32m=綠色 33m=黃色

34m=藍色 35m=洋紅 36m=青色 37m=白色

2)第一個指令碼,其中都一行為shell標誌,表示以下寫的程式為shell指令碼程式,後續的#表示注釋

[[email protected] ~]# vi hello.h

#!/bin/bash    

#Description:   The first program     

#Autor:         ws

#Date: 

 

echo "hello world"

3)指令碼執行

①通過Bash調用執行指令碼

[[email protected] ~]# bash hello.h

hello world

②賦予執行許可權,直接運行(習慣的執行方式)

[[email protected] ~]# chmod 755 hello.h

[[email protected] ~]# ./hello.h

hello world

引申:Linux的斷行符號符用"$"表示,可用過cat –A進行查看;windows的斷行符號符在Linux中顯示為"^M$",需使用dos2unix命令進行轉換。

3 Bash的準系統(1)曆史命令與命令補全

1)曆史命令history,其格式為:

history [選項] [曆史命令儲存檔案]

其中,-c選項表示清空曆史命令(一般不建議),-w表示把緩衝中的曆史命令寫入命令快取檔案~/.bash_history中。

history命令預設儲存1000條記錄,可以在環境變數設定檔/etc/profile中變更,所在位置為:HISTSIZE=1000。

曆史命令的調用方式有:

①使用上下箭頭調用

②使用"!n"執行第n條曆史命令

③使用"!!"重複執行上一條命令

④使用"!字串"重複執行最後一條以該字串開頭的命令

2)在Bash中,命令與檔案補全可通過"Tab"鍵來完成。

(2)命令別名與常用快速鍵

1)命令別名

設定命令別名的格式為:alias 別名="原命令"

查詢命令別名的方式為:alias

使用別名時注意命令的執行順序:

①第一順位為用絕對路徑或相對路徑執行的命令;

②第二順位為執行別名;

③第三順位為執行Bash的內部內建命令;

④第四順位為執行按照$PATH環境變數定義的目錄尋找順序找到的第一個命令。

可通過$PATH來查看系統的環境變數:

[[email protected] ~]# $PATH

-bash: /usr/lib/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin: 沒有那個檔案或目錄

注意:命令列定義的別名是臨時的,如需永久生效,則在家目錄的.bashrc中寫入別名即可,如root下的別名檔案:

[[email protected] ~]# vim /root/.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

~

刪除別名的命令為:unalias 別名。

2)Bash常用快速鍵

快速鍵

作用

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

恢複螢幕輸出

(3)輸入輸出重新導向

1)標準輸入輸出

裝置

裝置檔案名稱

檔案描述符

類型

鍵盤

/dev/stdin

0

標準輸入

顯示器

/dev/stdout

1

標準輸出

顯示器

/dev/stderr

2

標準錯誤輸出

2)輸出重新導向

類型

符號

作用

 

標準輸出重新導向

命令 > 檔案

以覆蓋的方式,把命令的正確輸出輸出到指定的檔案或裝置當中

命令 >> 檔案

以追加的方式,把命令的正確輸出輸出到指定的檔案或裝置當中

 

標準錯誤輸出重新導向

錯誤命令 2> 檔案

以覆蓋的方式,把命令的錯誤輸出輸出到指定的檔案或裝置當中

錯誤命令 2>> 檔案

以追加的方式,把命令的錯誤輸出輸出到指定的檔案或裝置當中

 

 

 

 

正確輸出和錯誤輸出同時儲存

命令 > 檔案 2>&1

以覆蓋的方式,把正確輸出和錯誤輸出都儲存到同一個檔案當中

命令 >> 檔案 2>&1

以追加的方式,把正確輸出和錯誤輸出都儲存到同一個檔案當中

命令 &> 檔案

以覆蓋的方式,把正確輸出和錯誤輸出都儲存到同一個檔案當中

命令 &>> 檔案

以追加的方式,把正確輸出和錯誤輸出都儲存到同一個檔案當中

命令 >> 檔案1 2>> 檔案2

把正確輸出追加到檔案1中,把錯誤輸出追加到檔案2中

例1:向test1檔案中寫入ls命令 的輸出:

[[email protected] ~]# ls > test1

[[email protected] ~]# cat test1

anaconda-ks.cfg

hello.h

install.log

install.log.syslog

ntfs-3g_ntfsprogs-2014.2.15.tgz

test1

testfile

例2:將date命令的輸出追加到test1中:

[[email protected] ~]# date >> test1

[[email protected] ~]# cat test1

anaconda-ks.cfg

hello.h

install.log

install.log.syslog

ntfs-3g_ntfsprogs-2014.2.15.tgz

test1

testfile

2015年 02月 21日 星期六 04:29:05 CST

例3:將錯誤輸出寫入test2檔案中:

[[email protected] ~]# lis 2>> test2

[[email protected] ~]# lst >> test2 2>&1

[[email protected] ~]# date &>> test2

[[email protected] ~]# cat test2

-bash: lis: command not found

-bash: lst: command not found

2015年 02月 21日 星期六 04:37:31 CST

註:一般將不需要的輸出直接丟進垃圾箱中,其相應的命令為:ls &> /dev/null

3)輸入重新導向

wc命令為統計命令,其格式為:

wc [選項] [檔案名稱]

其中,-c選項表示統計位元組數,-w選項表示統計單詞數,-l選項表示統計行數

輸入重新導向一般的格式為:命令 < 檔案,表示將檔案作為命令輸入,如:

[[email protected] ~]# wc < anaconda-ks.cfg

  54  124 1272

(4)多命令順序執行與管道符

1)多命令執行順序

多命令執行符

格式

作用

;

命令1;命令2

多個命令順序執行,命令之間沒有任何邏輯聯絡

&&

命令1&&命令2

邏輯與,當命令1正確執行,則命令2才會執行,當命令1執行不正確,則命令2不會執行

||

命令1||命令2

邏輯或,當命令1執行不正確,則命令2才會執行,當命令1正確執行,則命令2不會執行

例:

[[email protected] ~]# ls;date;cd /usr/;pwd

anaconda-ks.cfg  install.log         ntfs-3g_ntfsprogs-2014.2.15.tgz  test2

hello.h      install.log.syslog  test1                         testfile

2015年 02月 21日 星期六 04:51:56 CST

/usr

dd命令用於磁碟複製或資料複製,其格式為:

dd if=輸入檔案 of=輸出檔案 bs=位元組數 count=個數

其中,if=輸入檔案指定源檔案或源裝置,of=輸出檔案指定目標檔案或目標裝置,bs=位元組數表示一次輸入/輸出多少個位元組,即這些位元組看作資料區塊,count=個數表示輸入/輸出多少個資料區塊

例:向/root/testfile檔案中寫入/dev/zero的內容,共寫入100M,同時顯示存取時間:

[[email protected] usr]# date;dd if=/dev/zero of=/root/testfile bs=1k count=10000;date

2015年 02月 21日 星期六 05:01:43 CST

記錄了10000+0 的讀入

記錄了10000+0 的寫出

10240000位元組(10 MB)已複製,1.29893 秒,7.9 MB/秒

2015年 02月 21日 星期六 05:01:44 CST

[[email protected] usr]# ll -h /root/testfile

-rw-r--r--. 1 root root 9.8M 2月  21 05:01 /root/testfile

註:判定一條命令是否正確執行,可以通過如下命令格式:

命令 && echo yes || echo no

2)管道符

管道符的命令格式為:

命令1 | 命令2

表示命令1的正確輸出作為命令2的操作對象

例:使用more命令顯示/etc目錄下檔案的詳細資料:

[[email protected] usr]# ll -a /etc/ | more

總用量 1796

drwxr-xr-x. 103 root root  12288 2月  21 03:59 .

dr-xr-xr-x.  26 root root   4096 2月  21 03:59 ..

drwxr-xr-x.   3 root root   4096 1月   7 22:12 abrt

drwxr-xr-x.   4 root root   4096 1月   7 22:22 acpi

-rw-r--r--.   1 root root     44 2月  17 20:44 adjtime

……

grep命令用於搜尋,其命令格式為:

grep [選項] "搜尋內容" 檔案名稱

其中,-i選項表示忽略大小寫,-n選項表示輸出行號,-v選項表示反向尋找,--color-auto選項表示搜尋出的關鍵字用顏色顯示。

(5)萬用字元與其他特殊符號

1)萬用字元

萬用字元

作用

?

匹配一個任一字元

*

匹配0個或任意多個字元,也就是匹配任何內容

[]

匹配中括弧中任意一個字元

[-]

匹配中括弧中任意一個字元,-表示一個範圍,如[a-z]代表匹配一個小寫字母

[^]

邏輯非,表示匹配不是中括弧內的一個字元,例如[^0-9]代表一個不是數位字元

2)Bash中其他特殊符號

符號

作用

‘ ‘

單引號,在單引號中所有的特殊符號,如"$"和"`"(反引號)都沒有特殊含義

" "

雙引號,在雙引號中特殊符號都沒有特殊含義,但是"$"、"`"和"\"是例外,其特殊含義分別為"調用變數的值"、"引用命令"和"轉義符"

` `

反引號,反引號括起來的內容是系統命令,在Bash中會先執行它,和$()作用一樣,不過推薦使用$(),因為反引號容易看錯

$()

和反引號作用一樣,用來引用系統命令

#

在Shell指令碼中,#開頭的行代表注釋

$

用於調用變數的值,如需要調用變數name的值時,需要用$name的方式得到變數的值

\

轉義符,跟在\之後的特殊符號將失去特殊含義,變為一般字元。如\s將輸出$符號,而不當做變數引用

例:單引號與雙引號:

[[email protected] usr]# name=ws

[[email protected] usr]# echo "$name"

ws

[[email protected] usr]# echo ‘$name‘

$name

[[email protected] usr]# echo "$(date)"

2015年 02月 21日 星期六 05:29:24 CST

[[email protected] usr]# echo ‘$(date)‘

$(date)

例:反引號:

[[email protected] usr]# abc=`date`

[[email protected] usr]# echo $abc

2015年 02月 21日 星期六 05:31:57 CST

[[email protected] usr]# abc=$(date)

[[email protected] usr]# echo "$abc"

2015年 02月 21日 星期六 05:32:28 CST

Linux學習筆記(15)shell基礎之Bash準系統

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.