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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

shell 指令集锦

發布時間:2025/4/5 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 shell 指令集锦 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

0 shell簡介

Shell 是一個用 C 語言編寫的程序,它是用戶使用 Linux 的橋梁。

Shell 既是一種命令語言,又是一種程序設計語言。

Shell 腳本(shell script),是一種為 shell 編寫的腳本程序。

0.1 執行shell

方法1:作為可執行程序

保存為 test.sh,并 cd 到相應目錄:

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

注意,一定要寫成?./test.sh,而不是?test.sh

方法2:作為解釋器參數

直接運行解釋器,其參數就是 shell 腳本的文件名(該腳本文件可以無 "執行權限"。)

sh test.sh

1 shell變量

1.1 定義變量

定義變量時,變量名不加美元符號

以下語句將 /etc 下目錄的文件名循環出來。

for file in `ls /etc` 或 for file in $(ls /etc)

1.2 使用變量

使用一個定義過的變量,只要在變量名前面加美元符號即可

花括號是可選的(加花括號是為了幫助解釋器識別變量的邊界。推薦給所有變量加上花括號,這是個好的編程習慣。),但是一定要加美元符號

1.3 設置只讀變量(readonly)

1.4 刪除變量(unset)

變量被刪除后不能再次使用。

unset 命令不能刪除只讀變量。

2 shell 字符串

2.1 單引號

單引號里的任何字符都會原樣輸出,單引號字符串中的變量是無效的;

單引號字串中不能出現單獨一個的單引號(對單引號使用轉義符后也不行)

但單引號可成對出現,作為字符串拼接使用。

2.2 雙引號

  • 雙引號里可以有變量(變量需要$b使用)

  • 雙引號里可以出現轉義字符(用echo -e顯示轉義字符)

和單引號一樣,雙引號也能拼接字符

2.3 獲取字符串長度

也可以用length

2.4 截取子字符串

2.4.1 按照下標截取

假設有變量 var=http://www.aaa.com/123.htm

echo ${var:0:5}

?0 表示左邊第一個字符開始,5 表示字符的總個數。

結果是:http:

echo ${var:7}

?7 表示左邊第8個字符開始,一直到結束。

結果是 :www.aaa.com/123.htm

echo ${var:0-7:3}

0-7 表示右邊算起第七個字符開始,3 表示字符的個數。

結果是:123

echo ${var:0-7}

?

從右邊第七個字符開始,一直到結束。

結果是:123.htm

注:(左邊的第一個字符是用 0 表示,右邊的第一個字符用 0-1 表示)

2.4.2 #截取

#、##?表示從左邊開始刪除。

一個?#?表示從左邊刪除到第一個指定的字符;

兩個?#?表示從左邊刪除到最后一個指定的字符。

假設有變量 var=http://www.aaa.com/123.htm

echo ${var#*//}

從左邊開始刪除第一個 // 號及左邊的所有字符,

即刪除 http://

結果是 :www.aaa.com/123.htm

echo ${var##*/}

?表示從左邊開始刪除最后(最右邊)一個 / 號及左邊的所有字符,

即刪除 http://www.aaa.com/

結果是 123.htm

2.4.3 %截取

%、%%?表示從右邊開始刪除。

一個?%?表示從右邊刪除到第一個指定的字符;

兩個?%?表示從右邊刪除到最后一個指定的字符。

假設有變量 var=http://www.aaa.com/123.htm

echo ${var%/*}

從右邊開始,刪除第一個 / 號及右邊的字符

結果是:http://www.aaa.com

echo ${var%%/*}

從右邊開始,刪除最后(最左邊)一個 / 號及右邊的字符

結果是:http:

2.5 查找子字符串

注意,以上腳本中,`是反引號(鍵盤1左邊那個),不是單引號

3 shell數組

3.1 定義數組

在 Shell 中,用括號來表示數組,數組元素用"空格"符號分割開。定義數組的一般形式為:

數組名=(值1 2 ... 值n)

使用不連續的下標,如果接下來要讀取沒有賦值的下標位置的數組,不會報錯,但也不會有什么返回。

3.2 讀取數組

下標可以是變量(變量前面加不加$都可以)

3.3 獲取數組所有元組

使用?@/*?符號可以獲取數組中的所有元素

3.4?獲取數組長度

獲取數組長度的方式和獲取字符串長度的方式相同

4 shell注釋

4.1 單行注釋

以?#?開頭的行就是注釋,會被解釋器忽略。

通過每一行加一個?#?號設置多行注釋

4.2?多行注釋

5 shell傳參

我們可以在執行 Shell 腳本時,向腳本傳遞參數,腳本內獲取參數的格式為:$n

n?代表一個數字,1 為執行腳本的第一個參數,2 為執行腳本的第二個參數,以此類推……

$#

傳遞到腳本的參數個數

$*

以一個單字符串顯示所有向腳本傳遞的參數,以"$1 $2 … $n"的形式輸出所有參數

$$

腳本當前的進程ID號

$@

與$*相同,但是使用時加引號,并在引號中返回每個參數。

如"$@"用「"」括起來的情況、以"$1" "$2" … "$n" 的形式輸出所有參數。

5.1 *和@的區別

$* 與 $@ 區別:

  • 相同點:都是引用所有參數。
  • 不同點:只有在雙引號中體現出來。假設在腳本運行時寫了三個參數 1、2、3,,則 " * " 等價于 "1 2 3"(傳遞了一個參數),而 "@" 等價于 "1" "2" "3"(傳遞了三個參數)。
echo "-- \$* 演示 ---" for i in "$*"; doecho $i doneecho "-- \$@ 演示 ---" for i in "$@"; doecho $i done

6 shell基本運算符

注意事項:

1,表達式和運算符之間要有空格,例如 2+2 是不對的,必須寫成 2 + 2,這與我們熟悉的大多數編程語言不一樣。

2,完整的表達式要被?` `?包含,注意這個字符不是常用的單引號,在 Esc 鍵下邊。

3,常用的 +? -? *?? /??? %?? =?? ==?? != ,shell上都有

4,乘號(*)前邊必須加反斜杠(\)才能實現乘法運算;(在 MAC 中 shell 的 expr 語法是:$((表達式)),此處表達式中的 "*" 不需要轉義符號 "\" )

5,條件表達式要放在方括號之間,并且要有空格,例如:?[$a==$b]?是錯誤的,必須寫成?[ $a == $b ]。

6.1 shell關系運算符

-eq

判斷是否相等 (equal)

-ne

判斷是否不相等 (not equal)

-gt

判斷是否大于 (greater than)

-lt

判斷是否小于 (less than)

-ge

判斷是否大于等于 (greater equal)

-le

判斷是否小于等于 (less equal)

6.2 shell布爾運算符

-o

或運算(or)

-a

與運算(and)

6.3?字符串運算符

=

兩個字符串是否相等

!=

判斷兩個字符串是否不相等

-z

字符串長度是否為0(為0返回true)

-n

字符串長度是否不為0(不為0返回true)

6.4 shell邏輯運算符

&&邏輯的 AND
||邏輯的 OR

?

6.5 文件測試運算符

-d file檢測文件是否是目錄,如果是,則返回 true。[ -d $file ] 返回 false。
-f file檢測文件是否是普通文件,如果是,則返回 true。[ -f $file ] 返回?true。
-r file檢測文件是否可讀,如果是,則返回 true。[ -r $file ] 返回?true。
-w file檢測文件是否可寫,如果是,則返回 true。[ -w $file ] 返回?true。
-x file檢測文件是否可執行,如果是,則返回 true。[ -x $file ] 返回?true。
-s file檢測文件是否為空(文件大小是否大于0),不為空返回 true。[ -s $file ] 返回?true。
-e file檢測文件(包括目錄)是否存在,如果是,則返回 true。[ -e $file ] 返回?true。

7 shell echo 命令

7.1 顯示普通字符

7.2?顯示雙引號

7.3 -e 開啟轉義

7.4?顯示結果定向至某文件

7.5?顯示命令執行結果

8 shell 流程控制

和一般的語言不一樣,shell的流程控制不可為空,也就是說,如果else分支沒有語句可以執行,那么就不要寫這個else?

要注意的是,和 C 語言不同,shell 語言中 0 代表 true,0 以外的值代表 false。

8.1 if-else

8.2 if-elif-else

8.3 for

8.4 while

幾種自增的方法

let j++let "n++"let m+=1a=$[$a+1]

8.5 until

一直循環,直到某一次條件為true

8.6 case

每個 case 分支用右圓括號開始,用兩個分號?;;?表示 break,即執行結束,跳出整個 case ... esac 語句。

取值將檢測匹配的每一個模式。一旦模式匹配,則執行完匹配模式相應命令后不再繼續其他模式。如果無一匹配模式,使用星號 * 捕獲該值,再執行后面的命令。

8.7 跳出循環

shell中也有break和continue

9 shell 重定向

command > file

將輸出重定向到file

command < file

將輸入重定向到file

command >> file

將輸出以追加(append)的方式重定向到file

n > file

將文件描述符為n的文件重定向到file

n >> file

將文件描述符為n的文件以追加的方式重定向到file

n >& m

將輸出文件m和n合并

9.1 文件描述符

0

標準輸入 STDIN

1

標準輸出 STDOUT

2

標準錯誤輸出 STDERR

9.2 舉例

將 stdout 和 stderr 合并后重定向到 file

10 printf

printf 命令模仿 C 程序庫(library)里的 printf() 程序

printf "%-10s %-8s %-4s\n" 姓名 性別 體重kg printf "%-10s %-8s %-4.2f\n" 小趙 男 66.1234 printf "%-10s %-8s %-4.2f\n" 小錢 男 48.6543 printf "%-10s %-8s %-4.2f\n" 小孫 女 47.9876

%s %c %d %f?都是格式替代符

%s?輸出一個字符串(string)

%d?整型輸出(decimal)

%c?輸出一個字符(char)

%f?輸出浮點數。(float)

%-10s?指一個寬度為 10 個字符(-?表示左對齊,沒有則表示右對齊),任何字符都會被顯示在 10 個字符寬的字符內,如果不足則自動以空格填充,超過也會將內容全部顯示出來。

%-4.2f?指格式化為小數,其中?.2?指保留2位小數。

?

format-string 單引號雙引號效果一樣。

如果format-string中只有一個,甚至沒有引號都可以

格式只指定了一個參數,但多出的參數仍然會按照該格式輸出,format-string 被重用

如果沒有 arguments,那么 %s 用NULL代替,%d 用 0 代替

格式化浮點數默認支持小數點后面六位,多出來的四舍五入

10.1 printf 轉義序列

大體上和C是一樣的

\b后退
\c抑制(不顯示)輸出結果中任何結尾的換行字符
\f換頁(formfeed)
\n換行
\t水平制表符
\v垂直制表符
\\一個字面上的反斜杠字符
\ddd表示1到3位數八進制值的字符。僅在格式字符串中有效
\0ddd表示1到3位的八進制值字符,開頭有一個0

11 shell函數

linux shell 可以用戶定義函數,然后在shell腳本中可以隨便調用。

11.1 函數定義

shell中函數的定義格式如下:

  • 1、可以帶function fun() 定義,也可以直接fun() 定義,不帶任何參數。
  • 2、參數返回,可以顯示加:return 返回,如果不加,將以最后一條命令運行結果,作為返回值。 return后跟數值n(0-255)

下面定義一個帶有return語句的函數:

funWithReturn(){echo "這個函數會對輸入的兩個數字進行相加運算..."echo "輸入第一個數字: "read aNumecho "輸入第二個數字: "read anotherNumecho "兩個數字分別為 $aNum 和 $anotherNum !"return $(($aNum+$anotherNum)) }

那么我們怎么得到函數返回的值呢?使用$? 即可

$??僅對其上一條指令負責,一旦函數返回后其返回值沒有立即保存入參數,那么其返回值將不再能通過?$??獲得。

11.2 函數參數

在Shell中,調用函數時可以向其傳遞參數。

在函數體內部,通過 $n 的形式來獲取參數的值,例如,$1表示第一個參數,$2表示第二個參數...

funWithParam(){echo "第一個參數為 $1 !"echo "第二個參數為 $2 !"echo "第十個參數為 $10 !"echo "第十個參數為 ${10} !"echo "第十一個參數為 ${11} !"echo "參數總數有 $# 個!"echo "作為一個字符串輸出所有參數 $* !" }

注意,$10 不能獲取第十個參數,獲取第十個參數需要${10}。當n>=10時,需要使用${n}來獲取參數。

還有幾個特殊的參數,和第五節shell傳參是一樣的

$#

傳遞到腳本的參數個數

$*

以一個單字符串顯示所有向腳本傳遞的參數,以"$1 $2 … $n"的形式輸出所有參數

$$

腳本當前的進程ID號

$@

與$*相同,但是使用時加引號,并在引號中返回每個參數。

如"$@"用「"」括起來的情況、以"$1" "$2" … "$n" 的形式輸出所有參數。

?

總結

以上是生活随笔為你收集整理的shell 指令集锦的全部內容,希望文章能夠幫你解決所遇到的問題。

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