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 “adzpdzp2dzp3dzp34dzpcangdzpbolsdzpa使 ()

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