目錄
1、為何叫 Shell? " >1、為何叫 Shell?
2、Shell prompt(PS1)與 Carriage Return(CR)的關係? " >2、Shell prompt(PS1)與 Carriage Return(CR)的關係?
3、別人echo,你也echo,試問echo 知多少?" >3、別人echo,你也echo,試問echo 知多少?
4、雙引號""與單引號''有什麼區別? " >4、雙引號""與單引號''有什麼區別?
#5、var=value? export 前後差在哪裡? " >#5、var=value? export 前後差在哪裡?
6、exec 跟 source 差在哪?" >6、exec 跟 source 差在哪?
7、( ) 与 { } 差在哪?" >7、( ) 与 { } 差在哪?
8、$(()) 与 $() 还有 ${} 差在哪?" >8、$(()) 与 $() 还有 ${} 差在哪?
9、$@ 与 $* 区别在哪?" >9、$@ 与 $* 区别在哪?
10、&& 與 || 差在哪裡? " >10、&& 與 || 差在哪裡?
11、> 与 < 差在哪?" >11、> 与 < 差在哪?
12、你要if还是case呢?" >12、你要if还是case呢?
13、for what? while与until差在哪?" >13、for what? while与until差在哪?
首頁 運維 linux運維 關於 Shell 腳本的經典十三問

關於 Shell 腳本的經典十三問

Aug 03, 2023 pm 03:03 PM
shell shell腳本


關於 Shell 腳本的經典十三問

1、為何叫 Shell?

我們知道電腦的運作離不開硬件,但卻無法直接操作硬件,硬體的驅動只能透過稱為「作業系統(OS,Opertating System)的軟體來管控。Linux 嚴格來說是一個作業系統(OS)。

使用者沒有辦法直接操作Kernel,而是透過Kernel 的「外殼」程序,也就是所謂的Shell 來與Kernel 溝通。Shell 是一個使用者與系統的互動介面(Interface),只能透過命令列(Command line)來使用系統來完成工作。因此Shell 最簡單的定義就是:命令解譯器(Command Interpreter)

  • 將使用者的指令翻譯給核心處理;

  • #同時,將核心處理結果翻譯給使用者。

不同的OS 使用不同的Kernel;同一個kernel 之上,也可以使用不同的Shell,常見的Shell 有sh、bash、csh、ksh 等

2、Shell prompt(PS1)與 Carriage Return(CR)的關係?

成功登入Shell 終端機後,遊標左邊部分稱之為提示符號Prompt,通常一般使用者使用$,管理員使用者使用

  • #Shell Prompt:可以輸入指令了,鍵入指令後,直到讀進CR(Carriage Return)字元為止

  • Carriage Return:可以執行指令了

#若從技術的細節來看,Shell 會依據IFS(Internal Field Seperator)將Command line 所輸入的文字拆解為」欄位」(word/field)。然後再針對特殊字元(meta)先處理,最後重組整行command line。

3、別人echo,你也echo,試問echo 知多少?

echo 將argument送到標準輸出(stdout),通常顯示在螢幕

stdin 標準輸入
stdout 標準輸出
stderr 標準錯誤輸出

echo -n  # 取消换行符
echo -e  # 启用反斜杠转译
登入後複製

4、雙引號""與單引號''有什麼區別?

  • hard quote:''(單引號),關閉所有引用

  • soft quote:""(雙引號),保留$引用

#5、var=value? export 前後差在哪裡?

  • 變數定義:name=value,等號左右兩邊不能使用分隔符號。

  • 變數替換:echo ${name}

    #
  • export变量:export name=value,使变量成为环境变量

# 本地变量
A=B
# 取消变量
unset A
# 环境变量export A=B
登入後複製

6、exec 跟 source 差在哪?

环境变量只能从父进程到子进程单向传递。换句话说:在子进程中环境如何变更,均不会影响父进程的环境。
当我们执行一个shell script时,其实是先产生一个sub-shell的子进程, 然后sub-shell再去产生命令行的子进程。关注Linux中文社区

# 创建子shell执行脚本
./1.sh
# 当前shell执行
source 1.sh
# 当前shell执行后退出
exec 1.sh
登入後複製

7、( ) 与 { } 差在哪?

( )将 command group 置于 sub-shell 执行
{ }则是在同一个shell内完成

8、$(()) 与 $() 还有 ${} 差在哪?

# 假设我们定义了一个变量为:
file=/dir1/dir2/dir3/my.file.txt
# 我们可以用 ${ } 分别替换获得不同的值:

# 1. shell字符串的非贪婪(最小匹配)左删除
${file#*/} # 拿掉第一条 / 及其左边的字符串:dir1/dir2/dir3/my.file.txt
# 2. shell字符串的贪婪(最大匹配)左删除
${file##*/} # 拿掉最后一条 / 及其左边的字符串:my.file.txt
${file##*.} # 拿掉最后一个 . 及其左边的字符串:txt
# 3. shell字符串的非贪婪(最小匹配)右删除:
${file%/*} # 拿掉最后条 / 及其右边的字符串:/dir1/dir2/dir3
${file%.*} # 拿掉最后一个 . 及其右边的字符串:/dir1/dir2/dir3/my.file
# 4. shell字符串的贪婪(最大匹配)右删除:
${file%%/*} # 拿掉第一条 / 及其右边的字符串:(空值)
${file%%.*} # 拿掉第一个 . 及其右边的字符串:/dir1/dir2/dir3/my

记忆的方法为:
# 是去掉左边(在键盘上 # 在 $ 之左边)
% 是去掉右边(在键盘上 % 在 $ 之右边)
单一符号是最小匹配﹔两个符号是最大匹配。
登入後複製

# 5. shell字符串取子串:
${file:0:5}:提取最左边的 5 个字节:/dir1
${file:5:5}:提取第 5 个字节右边的连续 5 个字节:/dir2

# 6. shell字符串变量值的替换:
${file/dir/path}:将第一个 dir 提换为 path:/path1/dir2/dir3/my.file.txt
${file//dir/path}:将全部 dir 提换为 path:/path1/path2/path3/my.file.txt

# 7. ${}还可针对变量的不同状态(没设定、空值、非空值)进行赋值:
${file-my.file.txt} :假如 $file 没有设定,则使用 my.file.txt 作传回值。(空值及非空值时不作处理) 
${file:-my.file.txt} :假如 $file 没有设定或为空值,则使用 my.file.txt 作传回值。(非空值时不作处理)
${file+my.file.txt} :假如 $file 设为空值或非空值,均使用 my.file.txt 作传回值。(没设定时不作处理)
${file:+my.file.txt} :若 $file 为非空值,则使用 my.file.txt 作传回值。(没设定及空值时不作处理)
${file=my.file.txt} :若 $file 没设定,则使用 my.file.txt 作传回值,同时将 $file 赋值为 my.file.txt 。(空值及非空值时不作处理)
${file:=my.file.txt} :若 $file 没设定或为空值,则使用 my.file.txt 作传回值,同时将 $file 赋值为 my.file.txt 。(非空值时不作处理)
${file?my.file.txt} :若 $file 没设定,则将 my.file.txt 输出至 STDERR。(空值及非空值时不作处理)
${file:?my.file.txt} :若 $file 没设定或为空值,则将 my.file.txt 输出至 STDERR。(非空值时不作处理)

tips:
以上的理解在于, 你一定要分清楚 unset 与 null 及 non-null 这三种赋值状态.
一般而言, : 与 null 有关, 若不带 : 的话, null 不受影响, 若带 : 则连 null 也受影响.
登入後複製

# 8. 计算shell字符串变量的长度:${#var}
${#var} 可计算出变量值的长度:
${#file} 可得到 27 ,因为 /dir1/dir2/dir3/my.file.txt 刚好是 27 个字节...

# 9. bash数组(array)的处理方法
数组:
A=(a b c d)
引用数组:
${A[@]}
${A[*]}
访问数组成员
${A[0]}
计算数组长度
${#A[@]}
${#A[*]}
数组重新赋值
A[2]=xyz

# 10.$(( ))是用来做整数运算的 
a=5;b=7;c=2;
echo $(( a + b * c))
登入後複製

9、$@ 与 $* 区别在哪?

  • "$@"则可得到 “p1” “p2 p3” “p4” 这三个不同的词段

  • "$*"則可得到「p1 p2 p3 p4」 這一整串單一的詞段

  • 另外,搜尋公眾號Linux就該這樣學後台回复“git書籍”,獲取一份驚喜禮包。

10、&& 與 || 差在哪裡?

1、test指令有兩種形式

  • #test expression

  • [ expression ]

2、bash的test目前支援三種測試物件

  • string:字串

  • integer:整數

  • #file:檔案

    ################

3、当 expression 为真是返回 0(true) ,否则返回 非0(false)

  • command1 && command2 command2 只有在 command1 的RV为0(True)的条件下执行。

  • command1 || command2 command2只有在command1的RV为非0(False)的条件下执行。

4、先替换变量再比较

A=123[ -n "$A" ] && ([ "$A" -lt 100 ] || echo "too big")unset A
登入後複製

11、> 与 < 差在哪?

0: Standard Input(STDIN)
1: Standard Output (STDOUT)
2: Standard Error Output(STDERR)

我们可用 < 来改变读进的数据信道(stdin),使之从指定的档案读进。

我们可用 > 来改变送出的数据信道(stdout, stderr),使之输出到指定的档案。

ls my.file no.such.file 1> file.out 2>file.err
# 2>&1 就是将stderr并进stdout做输出
ls my.file no.such.file 1> file.out 2>&1
# /dev/null 空
ls my.file no.such.file >/dev/null 2>&1

cat < file > file
# 在 IO Redirection 中,stdout 与 stderr 的管道会先准备好,才会从 stdin 读进资料。
# 也就是说,在上例中,> file 会先将 file 清空,然后才读进 < file , 
# 但这时候档案已经被清空了,因此就变成读不进任何数据了
登入後複製

12、你要if还是case呢?

# if
echo -n "Do you want to continue?(Yes/No):"
read YN
if [ "$YN"=Y -o "$YN"=y -o "$YN"="Yes" -o "$YN"="yes" -o "$YN"="YES"];then
echo "continue"
else
exit 0
fi

# case
echo -n "Do you want to continue?(Yes/No):"
read YN
case "$YN" in
[Yy]|[Yy][Ee][Ss])
echo "continue"
;;
*)
exit 0
esac
登入後複製

13、for what? while与until差在哪?

# for
for ((i=1;i<=10;i++))
do
echo "num is $i"
done

# while
num=1
while [ "$num" -le 10 ]; do
echo "num is $num"
num=$(($num + 1))
done

# until
num=1
until [ "$num" -gt 10 ]; do
echo "num is $num"
num=$(($nu + 1))
done
登入後複製
  • break 是结束 loop

  • return 是结束 function

  • exit 是结束 script/shell

以上是關於 Shell 腳本的經典十三問的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

如何在Linux系統中執行.sh檔? 如何在Linux系統中執行.sh檔? Mar 14, 2024 pm 06:42 PM

如何在Linux系統中執行.sh檔?在Linux系統中,.sh文件是一種被稱為Shell腳本的文件,用於執行一系列的命令。執行.sh檔案是非常常見的操作,本文將介紹如何在Linux系統中執行.sh文件,並提供具體的程式碼範例。方法一:使用絕對路徑執行.sh文件要在Linux系統中執行一個.sh文件,可以使用絕對路徑來指定該文件的位置。以下是具體的步驟:打開終

如何將ESD檔案轉換為ISO格式 如何將ESD檔案轉換為ISO格式 Feb 19, 2024 am 08:37 AM

esd檔案是Windows作業系統中使用的一種壓縮格式,而ISO檔案是一種光碟映像文件,用於建立光碟副本或虛擬光碟機。當我們需要將esd檔轉換為iso檔時,可能是因為ISO檔比較常用,也比較容易使用。以下將為您介紹一些常用的方法來完成這個轉換過程。方法一:使用ESDDecrypterESDDecrypter是一款專門用於將esd檔案解密並轉換為iso檔案的

Linux根檔案系統的秘密 Linux根檔案系統的秘密 Feb 15, 2024 pm 01:42 PM

Linux是一種開源、可移植、可自訂的作業系統,它廣泛應用於各種領域,如伺服器、桌面、嵌入式裝置等。 Linux的核心是內核,它負責管理硬體資源和提供基本的服務。但是,核心並不是一個獨立的實體,它需要一個檔案系統來儲存和存取各種資料和程式。檔案系統是一種組織和管理檔案的方法,它定義了檔案的名稱、位置、屬性、權限等資訊。在Linux中,有許多不同類型的檔案系統,如ext4、xfs、btrfs等,它們各有特點和優勢。但是,在所有的檔案系統中,有一個特殊的檔案系統,它是Linux系統的基礎和核心,它就是

Linux快速刪除檔案末尾行的操作步驟 Linux快速刪除檔案末尾行的操作步驟 Mar 01, 2024 pm 09:36 PM

Linux系統下在處理檔案時,有時候需要刪除檔案末端的行。這種操作在實際應用中很常見,可以透過一些簡單的命令來實現。本文將介紹在Linux系統中快速刪除檔案結尾行的操作步驟,同時提供具體的程式碼範例。步驟一:檢視文件末尾行在進行刪除操作之前,首先需要確認文件的末尾行是哪一行。可以使用tail指令來查看文件的結尾行,具體指令如下:tail-n1filena

為何無法在Windows 7上執行bat文件 為何無法在Windows 7上執行bat文件 Feb 19, 2024 pm 03:19 PM

為什麼win7不能運行bat檔最近,許多使用Windows7作業系統的使用者反映他們無法執行.bat檔。這引發了廣泛的討論和疑惑。為什麼一個良好運作的作業系統不能運行一個簡單的.bat檔呢?首先,我們要先了解.bat檔的背景。 .bat文件,也稱為批次文件,是一種純文字文件,包含了一系列的命令,這些命令可以被Windows命令解釋器(cmd.ex

如何使用PowerShell自動執行任務 如何使用PowerShell自動執行任務 Feb 20, 2024 pm 01:51 PM

如果您是IT管理員或技術專家,您一定意識到自動化的重要性。尤其對於Windows用戶來說,MicrosoftPowerShell是最佳的自動化工具之一。微軟為滿足您的自動化需求提供了各種工具,無需安裝第三方應用程式。本指南將詳細介紹如何利用PowerShell自動化執行任務。什麼是PowerShell腳本?如果您有使用PowerShell的經驗,您可能已經使用過命令來設定您的作業系統。腳本是.ps1檔案中這些指令的集合。 .ps1檔案包含由PowerShell執行的腳本,例如基本的Get-Help

初學者的Windows PowerShell腳本教學 初學者的Windows PowerShell腳本教學 Mar 13, 2024 pm 10:55 PM

我們為初學者設計了這份WindowsPowerShell腳本教程,無論您是技術愛好者還是希望提高腳本編寫技能的專業人士。如果你對PowerShell腳本沒有先驗知識,這篇文章將從基礎開始,為您量身訂做。我們將協助您掌握PowerShell環境的安裝步驟,並逐步介紹PowerShell腳本的主要概念和功能。如果您已經做好準備,準備深入學習PowerShell腳本編程,那麼讓我們一起踏上這趟令人興奮的學習之旅吧!什麼是WindowsPowerShell? PowerShell是由微軟開發的混合了命令

url檔案怎麼打開 url檔案怎麼打開 Mar 28, 2024 pm 06:27 PM

使用URL檔案開啟網際網路資源的方法包括:使用網頁瀏覽器雙擊開啟。使用文字編輯器打開,複製連結地址並貼上到瀏覽器網址列。透過命令列,使用“start”或“open”命令指定URL檔案路徑。建立腳本文件,包含開啟URL文件的指令。

See all articles