Linux學習之Shell基礎

一、Shell概述

1.Shell概述:

   Shell:殼,Shell是一個命令行解釋器,它爲用戶提供了一個向Linux內核發送請求以便運行程序的界面級程序,用戶可以用Shell來啓動、掛起、停止甚至是編寫一些程序。類似於翻譯,相當windows的操作界面

   Shell同時還是一個功能相當強大的編程語言,易編寫,易調試,靈活性較強。Shell是解釋執行的腳本語言,在Shell中可以直接調用Linux命令。


2.Shell的分類:

Bourne Shell:從1979起Unix就開始使用的Bourne Shell

Bourne Shell的主文件名爲sh

C Shell:C Shell主要是在BSD版的unix系統中使用,其語法和c語言類似而得名

Shell主要有兩種語法:Bourne和C,這兩種語法彼此不兼容。

Bourne家族主要包括:sh、ksh、Bash(標準Shell)、psh、zsh;

C家族主要包括:csh、tcsh;主要用於Unix

Bash:Bash與sh兼容,現在使用的Linux就是使用bash作爲用戶的基本Shell。


3.Linux支持的Shell

保存在/etc/shells目錄下

[root@localhost ~]# vi /etc/shells

/bin/sh

/bin/bash

/sbin/nologin

/bin/tcsh

/bin/csh

[root@localhost ~]# sh

sh -4.1# exit

exit

[root@localhost ~]# csh

[root@localhost ~]# exit

exit

[root@localhost ~]# 

#那麼如何判斷我們進入的當前shell類型呢,使用echo $SHELL可以查看當前Shell

[root@localhost ~]# echo $SHELL

/bin/bash

父shell:初始時進入的Shell

子Shell:後面調用的Shell


二、腳本執行方式

1.echo輸出命令

  echo [選項][輸出內容]

  選項:

     -e :支持反斜線控制的字符轉換

控制字符:

\a    :輸出警告音

\b    :退格鍵,也就是向左刪除鍵

\n    :換行符

\r    :回車鍵

\t    :製表符,也就是Tab鍵

\v    :垂直製表符

\0nnn :按照八進制ASCll碼錶輸出字符。其中0爲數字0,nnn爲三位八進制數

\xhh  :按照十六進制ASCll碼錶輸出字符。其中hh是兩位十六進制數

[root@localhost ~]# echo "what do you want to do?"

what do you want to do?

[root@localhost ~]# echo -e "what do you want to\b do?"

what do you want t do?

[root@localhost ~]# echo -e "\x68\t\x65\t\x6c\n\x6c\t\x6f\t"

#按照十六進制ASCⅡ碼也同樣可以輸出

h   e   l

l   o

#注意,感嘆號在echo命令中是有特殊含義的

[root@localhost ~]# echo -e "\e[1;31m Do you want do \e[0m"

#輸出顏色:

#30m=黑色,31m=紅色,32m=綠色,33m=***

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

#\e[1;:開啓顏色

#\e[0m:關閉顏色


2.第一個腳本

#!/bin/bash

#The first Shell program

echo -e "\e[1;34m 天上掉下個林妹妹 \e[0m"

wq


[root@localhost ~]# vi hello.sh

#!/bin/bash標稱下面所寫的腳本是標準,純Shell是不會出錯,但是調用其他程序時會出錯

#學會寫註釋


3.腳本執行

 (1).賦予執行權限,直接運行

     chmod 755 hello.sh 

     ./hello.sh  相對路徑

 (2).通過Bash調用執行腳本

     bash hello.sh  #用bash直接解釋命令

如果腳本語法有錯誤可以通過:

[root@localhost ~]# vim hello.sh進行返回修改

注意用英文書寫符號

[root@localhost ~]# bash hello.sh

直接調用,或者:

[root@localhost ~]# chmod 755 hello.sh

[root@localhost ~]# ll

總用量 48

-rwxr-xr-x. 1 root root 91  7月 28  11:25  hello.sh

權限變成可執行了

[root@localhost ~]# ./hello.sh

天上掉下個林妹妹

[root@localhost ~]# /root/hello.sh

天上掉下個林妹妹


三、Bash的基本功能

1.命令別名與快捷鍵

命令別名==小名,另外一個稱呼

a.有些命令特別長,那麼我們可以取個別名,方便操作

b.操作系統升級後,命令格式發生了變化,那我們可以用舊的得命令去映射新的命令


 (1).alias

 #查看系統中所有的命令別名

[root@localhost ~]# alias

alias cp = 'cp -i'

alias l.= 'ls -d .* --color=auto'

...


 (2).alias 別名= ‘原命令’

 #設定命令別名

[root@localhost ~]# vi /etc/passwd #不支持顏色

[root@localhost ~]# vim /etc/passwd #支持顏色

我們可以:

[root@localhost ~]# alias vi='vim'


(3).別名永久生效與刪除別名

 vi ~/.bashrc

 #寫入環境變量配置文件(定義操作環境的配置文件)

進入到root下的.bashrc即興配置即可

alias rm ='rm -i'其中-i就使用詢問是否刪除的


(4).unalias 別名

 #刪除別名


(5).命令生效順序

第一順序:執行用絕對路徑或相對路徑執行的命令

第二順序:執行別名

第三順序:執行Bash的內部命令,Linux自帶的

第四順序:執行按照$PATH環境變量定義的目錄查找順序找到的第一個命令

[root@localhost ~]# echo $PATH


(6).常用快捷鍵

Ctrl+c 強制終止當前命令

Ctrl+l 清屏

Ctrl+a 光標移動到命令行首

Ctrl+e 光標移動到命令行行尾

Ctrl+u 從光標所在位置刪除到行首

Ctrl+z 把命令放到後臺

Ctrl+r 在歷時命令中搜索

[root@localhost ~]# ^c


2.歷史命令

(1).歷史命令

 history [選項][歷史命令保存文件] 

 選項:

  - c:清空歷史命令

  - w:把緩存中的歷史命令寫入歷史命令保存文件 ~/,bash_history

保存文本其實佔用很小

[root@localhost ~]# ls -alh

總用量 104K

-rw-------. 1 root root 7.2K 10月 10  02:27 .bash history

可以保存起來

另外:歷史命令默認會保存1000挑,可以在環境變量配置文件/etc/profile中進行修改

[root@localhost ~]# vi /etc/history

HISTSIZE=1000

可以直接修改

(2).歷史命令的調用

 使用上、下箭頭調用以前的歷史命令

 使用"!n"重複執行第n條歷史命令

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

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

[root@localhost ~]# history#可以查看所有在有效範圍出現了的歷史命令記錄

[root@localhost ~]# service network restart

正在關閉接口eth0:              [確定]

關閉環回接口:                  [確定]

彈出環回接口:                  [確定]

彈出界面 eth0:                 [確定]

這個時候我們再次使用就可以這樣輸入命令:

[root@localhost ~]# !ser

service network restart


(3).命令與文件補全

 在Bash中,命令與文件補全是非常方便與常用的功能,我們只要在輸入命令或者文件時,


按一下"Tab"鍵會自動補全,如果存在多個相關的命令

我們可以:按兩下"Tab"會彈出提示所有的相關命令

其實命令補全依賴$PATH命令,文件補全依賴與操作路徑


3.輸出重定向

(1).概述:

輸出重定向和輸入重定向:

把結果寫入計算機中叫做輸入,把結果顯示出來叫做輸出

設備      設備文件名       文件描述符         類型

鍵盤      /dev/stdin         0            標準輸入

顯示器    /dev/sdtout        1             標準輸出

顯示器    /dev/sdterr        2             標準錯誤輸出


(2).輸出重定向:

類型                    符號                作用

標準輸出重定向          命令>文件        以覆蓋的方式,把命令的正確輸出輸出到指定                                  的文件或設備當中

                   命令>>文件        以追加的方式,把命令的正確輸出輸出到指定                                     的文件或設備當中

標準錯誤輸出重定向       錯誤命令2>文件      以覆蓋的方式,把命令的錯誤輸出輸出到指定                                   的文件或設備當中

                   錯誤命令2>>文件     以追加的方式,把命令的錯誤輸出輸出到指定                                   的文件或設備當中

正確輸出和錯誤輸出       命令>文件 2>&1      以覆蓋的方式,把命令的正確和錯誤輸出輸出                                   同時保存到指定的文件當中

                   命令>>文件 2>&1     以追加的方式,把命令的正確和錯誤輸出輸出                                   到指定的文件當中

                   命令&>文件        以覆蓋的方式,把正確輸出和錯誤輸出都保存                                   在同一個文件當中

                   命令&>>文件       以追加的方式,把命令的正確和錯誤輸出輸出                                   到指定的文件當中

                  命令>>文件1 2>>文件2   以追加的方式,把命令的正確輸出保存到文件                                   1,把錯誤的輸出保存到文件2


通過輸出重定向,把輸出結果保存起來,可以實現無人值守

[root@localhost ~]# ifconfig > test.log

[root@localhost ~]# cat test.log

#輸出結果:...

只要命令有輸出,都可以保存到指定位置,注意>大於號會覆蓋之前的結果,不想覆蓋就使用>>,如果目標文件不存在會自動創建。

如果命令不存在,或者有錯誤,我們應該用2>或者2>>來保存錯誤信息,錯誤信息和正確信息應該用不同的重定向格式,注意>或>>左右兩邊沒有空格

注意:

[root@localhost ~]# ls &>/dev/null

其中/dev/null是一個空,裏面的文件會直接刪除掉,那麼保存的日誌將會銷燬,找不到了

作用:在寫腳本時,不需要過程,只查看結果                


(3).輸入重定向

[root@localhost ~]# wc [選項][文件名]

選項:

 -c 統計字節數 count

 -w 統計單詞數 word

 -l 統計行數 list

[root@localhost ~]# wc

abd

ert

#ctrl+d

      2  2   6

單詞之間靠空格來分隔


命令<文件    把文件作爲命令的輸入,統計文件的字節數,單詞數

命令<<標識符

[root@localhost ~]# wc << dy(相當於結束標記)

>asd

>

>erty

>dy

 4  3 11

...

標識符把標識符之間內容作爲命令的輸入


4.管道符

(1).多命令順序執行

多命令執行符      格式           作用

   ;         命令1; 命令2  多個命令順序執行,命令之間沒有任何邏輯聯繫


   &&         命令1&&命令2   邏輯與(沒有數據傳遞)

                             當命令1正確執行,則命令2纔會執行

                             當命令1執行不正確,則命令2不會執行


   ||         命令1||命令2   邏輯或(沒有數據傳遞)

                             當命令1執行不正確時,命令2纔會執行

                             當命令1正確執行時,命令2不會執行 


注意分號是英文的;

[root@localhost ~]# ls && echo yes || echo no

acces.log  ....

yes

[root@localhost ~]#  lsa && echo yes || echo no

-bash: lsa:command not found

no

順序不能顛倒: && echo yes || echo no

這裏的命令1可以有多個命令,如果其中有一個命令執行了,那麼命令1就是存在正確,&&會


執行,||命令2不執行

[root@localhost ~]#  ls || echo no && echo yes

yes

[root@localhost ~]# lsa || echo no && echo yes

no

yes


(2)管道符

命令格式:

 [root@localhost ~]# 命令1 | 命令2

#命令1的正確輸出作爲命令2的操作對象


例子:

[root@localhost ~]#  ls -l /etc | more

把etc的文件分屏顯示

[root@localhost ~]# netstat -an | grep ESTABLISHEN

tcp   0    52  192.168.0.156:22     192.168.0.155:1459      ESTABLISHEN

#提取網絡監聽端口情況

[root@localhost ~]# netstat -an |  grep ESTABLISHEN  | wc -l

1 #統計連接結果個數


5.通配符

(1).概述:可以用來匹配其他符號的字符


通配符      作用

 ?         匹配任意一個字符

 *          匹配0個或多個任意字符,也就是可以匹配任意內容

 []         匹配中括號中任意一個字符。例如:[abc]代表一定匹配其中一個字符:a或b  

            或c

 [-]        匹配中括號中任意一個字符,-代表一個範圍,例如:[a-z]代表從a-z的一個  

           小寫字母  

 [^]        邏輯非,表示匹配不是中括號內的一個字符。例如:[^0-9]代表匹配的不是一 

           個數字的字符


注:除了*可以匹配多個字符,其他一次只能匹配一個

例子:

[root@localhost ~]# mkdir dy

[root@localhost ~]# cd /root/dy

[root@localhost dy]# pwd

/root/dy

[root@localhost dy]# touch dzp

[root@localhost dy]# touch dzp2

[root@localhost dy]# touch dzp3

[root@localhost dy]# touch dzp34

[root@localhost dy]# touch dzpcang

[root@localhost dy]# touch dzpbols

[root@localhost dy]# touch dzpa

[root@localhost dy]# ls

dzp  dzp2  dzp3  dzp34  dzpcang  dzpbols

[root@localhost dy]# ls dzp

dzp

[root@localhost dy]# ls dzp*

dzp  dzp2  dzp3  dzp34  dzpcang  dzpbols

[root@localhost dy]# ls dzp?

dzp2  dzp3  

[root@localhost dy]# ls dzp[0-9]

dzp2  dzp3

[root@localhost dy]# ls dzp[0-9][0-9]

dzp34

[root@localhost dy]# ls dzp[^0-9]

dzpa

注:通配符主要用來匹配文件名或者文件目錄,如果要匹配文件內容,需要用到正則表達式


(3).Bash中其他特殊符號:

 符號                             作用

 ''        單引號,在單引號中所有的特殊符號,如“$”和“`”和“\”都沒有特殊含義

 

 ""        雙引號。在雙引號中特殊符號都沒有特殊含義,但是“$”和“`”和“\”例外

           擁有“調用變量的值”,“引用命令”和“轉義符”的特殊含義


 ``        反引號。反引號括起來的內容是系統命令,在Bash中會先執行它,和$()作用一 

           樣,不過推薦使用$(),反引號容易看錯


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

 

 #         在shell腳本中,#開頭的行代表註釋 

 

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

           量的值


 \         轉義符,跟在\之後的特殊符號都將失去意義,變成普通字符,如\$將輸出“$  

         ”符號,而不是當作變量引用


[root@localhost dy]# a=123

[root@localhost dy]# echo $a

123

[root@localhost dy]# echo '$a'

$a

[root@localhost dy]# echo "$a"

123

[root@localhost dy]# a=ls

[root@localhost dy]# echo "$a"

ls

[root@localhost dy]# a=`ls`

[root@localhost dy]# echo "$a"

dzp

dzp2

dzp3

dzp34

dzpcang

dzpbols

dzpa

一般不是用``容易和''單引號混淆,我們可以使用$()











發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章