日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

Linux下的shell简介(三)

發布時間:2025/3/8 linux 44 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Linux下的shell简介(三) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

2019獨角獸企業重金招聘Python工程師標準>>>

一、什么是shell

????????shell的本意是“殼”的意思,其實已經很形象地說明了shell在Linux系統中的作用。shell就是圍繞在Linux內核之外的一個“殼”程序,

用戶在操作系統上完成的所有任務都是通過shell與Linux系統內核的交互來實現的。

我們應該熟悉DOS系統中command.com程序,shell的功能與此類似,但是shell的功能更加強大,更加好用。

????????各種操作系統都有自己的shell以DOS為例,它的shell就是command.com程序。DOS下還出現了很多第三方命令解釋程序,例如4DOS、NDOS等,這些命令解釋程序完全可以取代標準的command.com程序。同樣,Linux下除了默認的Bourne again shell(bash),還有很多其他的shell,例如C shell(csh)、Korn shell(ksh)、Bourne shell(sh)和Tenex C shell(tcsh)等。每個版本的shell功能基本相同,但各有千秋,現在的Linux系統發行版一般都以bash作為默認的shell

????????shell本身是一個C語言編寫的程序,是用戶和操作系統內核之間通信的橋梁。shell既是一種命令解釋程序,又是一種功能強大的解釋型程序設計語言。作為命令解釋程序,shell解釋用戶輸入的命令,然后提交到內核處理,最后把結果返回給用戶。

????????為了加快命令的運行,同時更有效地定制shell程序,shell中定義了一些內置的命令,一般我們把shell自身解釋執行的命令稱為內置命令

例如下面我們將要講到的cd、exit和echo等命令,都是屬于bash的內置命令。

當用戶登錄系統后,shell以及內置命令就被系統載入到內存,并且一直運行,直到用戶退出系統為止

????????除了內置命令,Linux系統上還有很多可執行文件。可執行文件類似于Windows下的.exe文件,這些可執行文件也可以作為shell命令來執行。其實Linux上很多命令都不是shell的內置命令,例如ls就是一個可執行文件,存放在/bin/ls中。這些命令與shell內置命令不同,只有當它們被調用時,才由系統裝入內存執行

????????當用戶登錄系統后,如果是登錄字符界面,將出現shell命令提示符。“#”表示登錄的用戶是系統超級用戶,“$”表示登錄到系統的是普通用戶。

????????shell執行命令解釋的具體過程為:用戶在命令行輸入命令提交后,shell程序首先檢測是否為內置命令,如果是,就通過shell內部的解釋器將命令解釋為系統調用,然后提交給內核執行;如果不是shell內置的命令,那么shell會按照用戶給出的路徑或者根據系統環境變量的配置信息在硬盤尋找對應的命令,然后將其調入內存,最后再將其解釋為系統調用,提交給內核執行。

????????最后shell還是強大的解釋型程序設計語言,它定義了各種選項和變量,幾乎支持高級程序語言的所有程序結構,例如變量、函數、表達式和循環等。利用shell可以編寫shell腳本程序,類似于Windows/DOS下的批處理文件,但是shell功能更加完善,更加強大。

?

二、shell命令的語法分析

????????Linux下的各種shell的主要區別在于命令行的語法。對于一些普通的命令,各個shell版本的語法基本相同,只有在編寫一個shell腳本或者使用一些shell高級特性的時候,各個版本shell的差異才會顯示出來。

????????shell語法分析是指shell的對命令的掃描處理過程,也就是把命令或者用戶輸入的內容分解成要處理的各個部分的操作。在Linux系統下,shell語法分析包含很多的內容,例如重定向、文件名擴展和管道等。

????? ? 本節以bash為例,介紹shell命令的語法分析。

????????1.shell的命令格式

????????用戶登錄系統后,shell命令行啟動。shell遵循一定的語法格式將用戶輸入的命令進行分析解釋并傳遞給系統內核。

????????shell命令的一般格式為:

?????????command? ? [-options] ? ?parameter1 parameter2 ...

????????其中,

  • ? command:表示命令的名稱,例如變換路徑的指令為cd等等;
  • ? options:表示命令的選項方括號[] 并不存在實際的指令中,而加入參數設定時,通常為 - 號,有時候完整名稱會輸入 -- 符號;
  • ? parameter1 parameter2 ...:表示命令的參數為依附在options后面的參數,或者是command的參數;
  • ? 中間以空格來區分,不論空幾格shell都視為一格
  • ? 指令太長的時候,可以使用 \ 符號來【Enter】,使指令連續到下一行。

????

? ? 根據習慣,我們一般把具有以上格式的字符串稱為命令行。命令行是用戶與shell之間對話的基本單位

? ? 在命令行中,選項是包含一個或多個字母的代碼,主要用于改變命令的執行方式。一般選前前面有一個"-" 符號,用于區別參數

?

例如:

[root@server?~]#ls -a

ls命令加上-a選項后,列出當前目錄下的所有文件(包含隱藏文件)。如果ls不加“-a”選項,則僅僅顯示當前目錄下的文件名和目錄(不顯示隱藏文件)。

一般命令都有很多選項,可以單獨列出它們,也可以在“-”后面把需要的選項都列出來,例如,

ls?–a?–l也可以寫成:ls?–al

很多命令都可以接受參數。參數就是在選項后面緊跟的一個或多個字符串,這些字符串指定了命令的操作對象,如文件或者目錄。

例如,要顯示/etc目錄下的所有文件及信息,可用以下命令:

[root@Server ~]#ls?–al??/etc

特殊情況下,有些命令可以不帶參數,例如ls命令,而有些必須帶參數。當參數不夠時,shell就會給出錯誤提示。例如,mv命令至少需要兩個參數。

[root@Server ~]#mv??mylinux1.txt??mylinux.txt

在shell的一個命令行中,還可以輸入多個命令用分號 ; 將各個命令分開,例如:

[root@Server ~]#ls?–al;cp mylinux1.txt??mylinux2.txt

相反也可以在多行中輸入一個命令,用“\”將一個命令持續到下一行

[root@Server ~]#cp?–i \

>mylinux1.txt \

> mylinux2.txt

????????2.shell的通配符

????????????????????通配符主要是為了方便用戶對文件或者目錄的描述,例如用戶僅僅需要以“.sh”結尾的文件時,使用通配符就能很方便地實現。各個版本的shell都有通配符,這些通配符是一些特殊的字符,用戶可以在命令行的參數中使用這些字符,進行文件名或者路徑名的匹配。shell將把與命令行中指定的匹配規則符合的所有文件名或者路徑名作為命令的參數,然后執行這個命令。

bash中常用的通配符有“*”、“?”、“[]”。

(a)“*”——匹配任意一個或多個字符

例如:

[root@Server ~]#ls *.txt

這個命令是列出當前目錄中所有以“.txt”結尾的文件(除去以“.”開頭的文件)。

[root@Server ~]#cp doc/* /opt

表示將doc目錄下的所有文件(除去以“.”開頭的文件)拷貝到/opt目錄下。

(b)“?”——匹配任意單一字符

例如:

[root@Server ~]#ls ab?.txt

將列出當前目錄下以ab開頭,隨后一個字母是任意字符,接著以“.txt”結尾的文件。

[root@Server ~]#ls ab??.txt

將列出當前目錄下以ab開頭,隨后的兩個字母是任意字符,接著以“.txt”結尾的文件。

(c)“[]”——匹配任何包含在方括號內單字符

例如:

[root@Server ~]#ls /dev/sda[12345]

/dev/sda1??/dev/sda2??/dev/sda3??/dev/sda4??/dev/sda5

上面列出了在/dev目錄下以sda開頭,第4個字符是1、2、3、4或5的所有文件。

[root@Server ~]#ls /dev/sda[1-5]

在方括號中“1-5”給出了匹配的范圍,與上面一條命令完全等效。

(d)通配符的組合使用

在Linux下,通配符也可以組合使用,例如:

[root@Server ~]#ls [0-9]?.conf

列出當前目錄下以數字開頭,隨后一個是任意字符,接著以“.conf”結尾的所有文件。

[root@Server ~]#ls [xyz]*.txt

列出當前目錄下以x、y或z開頭,最后以“.txt”結尾的文件。


????????3.shell的重定向

Linux下系統打開3個文件,即標準輸入、標準輸出和標準錯誤輸出。用戶的shell將鍵盤設為默認的標準輸入,默認的標準輸出和標準錯誤輸出為屏幕。也就是用戶從鍵盤輸入命令,然后將結果和錯誤信息輸出到屏幕。

所謂的重定向,就是不使用系統默認的標準輸入輸出,而是重新指定,因此重定向分為輸入重定向、輸出重定向和錯誤輸出重定向。

?

?

????????4.shell的管道

????管道可以把很多命令連接起來,可以把第1個命令的輸入當作第2個命令的輸出,第2個命令的輸出當作第3個命令的輸入,依此類推。因此,管道的作用就是把一個命令的輸出當作下一個命令的輸入,而不經過任何中間文件。

? ? 通過 管道符 “|” ?可以建立管道連接。

例如:列一個目錄下的文件,由于內容太多,我們應該學會用more來分頁顯示。這得和管道?|?結合起來?。(每頁顯示5個文件信息,按 Ctrl+F 或者 空格鍵 將會顯示下5條文件信息)

按 【空格鍵】

?

????????5.shell中的引用

在bash中有很多特殊字符,這些字符本身就具有特殊含義。如果在shell的參數中使用它們,就會出現問題。Linux中使用了“引用”技術來忽略這些字符的特殊含義

引用技術就是通知shell將這些特殊字符當作普通字符處理

shell中用于引用的字符有轉義字符“\”、單引號“'”、雙引號“" "”

?

1)轉義字符“\”

如果將“\”放到特殊字符前面,shell就忽略這些特殊字符的原有含義,當作普通字符對待,例如:

[root@Server ~]#ls

abc?*??C:\backup

[root@Server ~]#mv abc\?\*??abc

[root@Server ~]#mv C\:\\backup backup

上面是將abc?*重命令為abc,將C:\backup重命名為backup。因為文件名中含有特殊字符,所有都使用了轉義字符“\”。

?

2)單引號“'”

將字符串放到一對單引號之間,那么字符串中所有字符的特殊含義將被忽略,例如:

[root@Server ~]#mv C\:\\backup backup

[root@Server ~]#mv 'C:\backup'??backup

上面兩條命令完全等效。

?

3)雙引號“" "”

雙引號的引用與單引號基本相同,包含在雙引號內的大部分特殊字符可以當作普通字符處理,但是仍有一些特殊字符即使用雙引號括起來,也仍然保留自己的特殊含義,比如“$”、“\”和“`”。

[root@Server ~]#str="The \$SHELL Current shell is $SHELL"

[root@Server ~]#str1="\$$SHELL"

[root@Server ~]#echo $str

The $SHELL Current shell is /bin/bash

[root@Server ~]#echo $str1

$/bin/bash

從上面輸出可以看出,“$”和“\”在雙引號內仍然保留了特殊含義。

[root@Server ~]# str="This hostname is `hostname`"

[root@Server ~]# echo $str

This hostname is Server

上面的輸出中,字符“`”在雙引號中也保留了自己特殊含義。
?

????????6.shell的自動補齊命令行

自動補齊命令行是bash一個簡單而且實用的功能,自動補齊命令行也就是在輸入命令時不必把命令輸全,shell就能智能判斷用戶所要輸入的命令。

當用戶輸入某個命令的一部分后,按下“Tab”鍵,shell就會根據系統環境變量信息提示出與用戶輸入命令相似的所有命令和文件,例如:

[root@Server ~]# if <按Tab鍵>

if? ? ifcfg? ? ifconfig? ?ifdown? ? ifenslave??ifnames? ? ifrename? ?ifup

可以從上面看到,用戶輸入“if”后按“Tab”鍵,即可顯示以“if”為前綴的所有命令和文件。如果需要的是ifconfig命令,那么只需再次輸入“co”,然后按“Tab”鍵,shell就能補全命令。

?

三、Shell有兩種執行命令的方式:

  • 交互式(Interactive):解釋執行用戶的命令,用戶輸入一條命令,Shell就解釋執行一條。
  • 批處理(Batch):用戶事先寫一個Shell腳本(Script),其中有很多條命令,讓Shell一次把這些命令執行完,而不必一條一條地敲命令。


Shell腳本和編程語言很相似,也有變量和流程控制語句,但Shell腳本是解釋執行的,不需要編譯,Shell程序從腳本中一行一行讀取并執行這些命令,相當于一個用戶把腳本中的命令一行一行敲到Shell提示符下執行。

?

四、幾種常見的Shell

hell是一種腳本語言,那么,就必須有解釋器來執行這些腳本。

Unix/Linux上常見的Shell腳本解釋器有bash、sh、csh、ksh等,習慣上把它們稱作一種Shell。我們常說有多少種Shell,其實說的是Shell腳本解釋器

bash

bash是Linux標準默認的shell。bash由Brian Fox和Chet Ramey共同完成,是BourneAgain Shell的縮寫,內部命令一共有40個

Linux使用它作為默認的shell是因為它有諸如以下的特色:

·?可以使用類似DOS下面的doskey的功能,用方向鍵查閱和快速輸入并修改命令。

·?自動通過查找匹配的方式給出以某字符串開頭的命令。

·?包含了自身的幫助功能,你只要在提示符下面鍵入help就可以得到相關的幫助。

sh

sh 由Steve Bourne開發,是Bourne Shell的縮寫,sh 是Unix 標準默認的shell。

ash

ash shell 是由Kenneth Almquist編寫的,Linux中占用系統資源最少的一個小shell,它只包含24個內部命令,因而使用起來很不方便。

csh

csh 是Linux比較大的內核,它由以William Joy為代表的共計47位作者編成,共有52個內部命令。該shell其實是指向/bin/tcsh這樣的一個shell,也就是說,csh其實就是tcsh。

ksh

ksh 是Korn shell的縮寫,由Eric Gisin編寫,共有42條內部命令。該shell最大的優點是幾乎和商業發行版的ksh完全兼容,這樣就可以在不用花錢購買商業版本的情況下嘗試商業版本的性能了。

注意:bash是 Bourne Again Shell 的縮寫,是linux標準的默認shell ,它基于Bourne shell,吸收了C shell和Korn shell的一些特性。bash完全兼容sh,也就是說,用sh寫的腳本可以不加修改的在bash中執行

五、Shell腳本語言與編譯型語言的差異

大體上,可以將程序設計語言可以分為兩類:編譯型語言解釋型語言

編譯型語言

很多傳統的程序設計語言,例如Fortran、Ada、Pascal、C、C++和Java,都是編譯型語言。這類語言需要預先將我們寫好的源代碼(source code)轉換成目標代碼(object code),這個過程被稱作“編譯”。

運行程序時,直接讀取目標代碼(object code)。由于編譯后的目標代碼(object code)非常接近計算機底層,因此執行效率很高,這是編譯型語言的優點。

但是,由于編譯型語言多半運作于底層,所處理的是字節、整數、浮點數或是其他機器層級的對象,往往實現一個簡單的功能需要大量復雜的代碼。例如,在C++里,就很難進行“將一個目錄里所有的文件復制到另一個目錄中”之類的簡單操作。

解釋型語言

解釋型語言也被稱作“腳本語言”。執行這類程序時,解釋器(interpreter)需要讀取我們編寫的源代碼(source code),并將其轉換成目標代碼(object code),再由計算機運行。因為每次執行程序都多了編譯的過程,因此效率有所下降。

使用腳本編程語言的好處是,它們多半運行在比編譯型語言還高的層級,能夠輕易處理文件與目錄之類的對象;缺點是它們的效率通常不如編譯型語言。不過權衡之下,通常使用腳本編程還是值得的:花一個小時寫成的簡單腳本,同樣的功能用C或C++來編寫實現,可能需要兩天,而且一般來說,腳本執行的速度已經夠快了,快到足以讓人忽略它性能上的問題。腳本編程語言的例子有awk、Perl、Python、Ruby與Shell

?

六、什么時候使用Shell

因為Shell似乎是各UNIX系統之間通用的功能,并且經過了POSIX的標準化。因此,Shell腳本只要“用心寫”一次,即可應用到很多系統上。因此,之所以要使用Shell腳本是基于:

簡單性:Shell是一個高級語言;通過它,你可以簡潔地表達復雜的操作。

可移植性:使用POSIX所定義的功能,可以做到腳本無須修改就可在不同的系統上執行。

開發容易:可以在短時間內完成一個功能強大又妤用的腳本。


但是,考慮到Shell腳本的命令限制和效率問題,下列情況一般不使用Shell:

1.?資源密集型的任務,尤其在需要考慮效率時(比如,排序,hash等等)。

2.?需要處理大任務的數學操作,尤其是浮點運算,精確運算,或者復雜的算術運算(這種情況一般使用C++或FORTRAN 來處理)。

3.?有跨平臺(操作系統)移植需求(一般使用C 或Java)。

4.?復雜的應用,在必須使用結構化編程的時候(需要變量的類型檢查,函數原型,等等)。

5.?對于影響系統全局性的關鍵任務應用。

6.?對于安全有很高要求的任務,比如你需要一個健壯的系統來防止入侵、破解、惡意破壞等等。

7.?項目由連串的依賴的各個部分組成。

8.?需要大規模的文件操作。

9.?需要多維數組的支持。

10.?需要數據結構的支持,比如鏈表或數等數據結構。

11.?需要產生或操作圖形化界面 GUI。

12.?需要直接操作系統硬件。

13.?需要 I/O 或socket 接口。

14.?需要使用庫或者遺留下來的老代碼的接口。

15.?私人的、閉源的應用(shell 腳本把代碼就放在文本文件中,全世界都能看到)。


如果你的應用符合上邊的任意一條,那么就考慮一下更強大的語言吧——或許是Perl、Tcl、Python、Ruby——或者是更高層次的編譯語言比如C/C++,或者是Java。即使如此,你會發現,使用shell來原型開發你的應用,在開發步驟中也是非常有用的。

?

七、第一個Shell腳本

打開文本編輯器,新建一個文件,擴展名為sh(sh代表shell),擴展名并不影響腳本執行,見名知意就好,如果你用php寫shell 腳本,擴展名就用php好了。

輸入一些代碼:

?#!/bin/bashecho "Hello World !"

#!” 是一個約定的標記,它告訴系統這個腳本需要什么解釋器來執行,即使用哪一種Shellecho命令用于向窗口輸出文本

運行Shell腳本有兩種方法。

?

作為可執行程序

將上面的代碼保存為test.sh,并 cd 到相應目錄:

chmod +x ./test.sh ?#使腳本具有執行權限

./test.sh ?#執行腳本

注意,一定要寫成./test.sh,而不是test.sh。運行其它二進制的程序也一樣,直接寫test.sh,linux系統會去PATH里尋找有沒有叫test.sh的,而只有/bin, /sbin, /usr/bin,/usr/sbin等在PATH里,你的當前目錄通常不在PATH里,所以寫成test.sh是會找不到命令的,要用./test.sh告訴系統說,就在當前目錄找

通過這種方式運行bash腳本,第一行一定要寫對,好讓系統查找到正確的解釋器。

這里的"系統",其實就是shell這個應用程序(想象一下Windows Explorer),但我故意寫成系統,是方便理解,既然這個系統就是指shell,那么一個使用/bin/sh作為解釋器的腳本是不是可以省去第一行呢?是的

作為解釋器參數

這種運行方式是,直接運行解釋器,其參數就是shell腳本的文件名,如:

/bin/sh test.sh/bin/php test.php

這種方式運行的腳本,不需要在第一行指定解釋器信息,寫了也沒用。

再看一個例子。下面的腳本使用?read?命令從 stdin 獲取輸入并賦值給?PERSON 變量,最后在 stdout 上輸出:

1.?#!/bin/bash

2.?

3.?# Author : mozhiyan

4.?# Copyright (c) http://see.xidian.edu.cn/cpp/linux/

5.?# Script follows here:

6.?

7.?echo "What is your name?"

8.?read?PERSON

9.?echo "Hello, $PERSON"

運行腳本:

chmod +x ./test.sh

$./test.sh

What is your name?

mozhiyan

Hello, mozhiyan

$

?

?

轉載于:https://my.oschina.net/wuweixiang/blog/1541062

總結

以上是生活随笔為你收集整理的Linux下的shell简介(三)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。