Shell中括號的使用

2022-06-04 11:51:09 字數 4184 閱讀 7576

變數的判斷與初始化,示例如下:

sh-4.2# file=/dir1/dir2/dir3/my.file

.txt

sh-4.2# echo $

dir1/dir2/dir3/my.file.txt

普通擴充套件,示例如下:

sh-4.2# echo

ahabh ach adh aeh afh agh

自動補全,示例如下:

sh-4.2# echo

a b c d e f

**塊,示例如下:

#!/bin/bash

num()

num

shell擴充套件中並沒有中括號的使用,shell命令中對中括號主要是用於判斷,類似test,示例如下:

1.單括號test命令要對變數進行單詞分離,當變數值包含空白符時,要用引號將變數括起來;而雙括號的test命令不會對變數進行單詞分離。以下情況分為變數為單個單詞,含有空格的片語。

sh-4.2# name=hello

sh-4.2# [ $name = "

hello"]

sh-4.2# echo $?

0sh-4.2# [[ $name = "

hello"]]

sh-4.2# echo $?

0

得出結論,因為變數只有乙個單詞,單雙括號的單詞分離都沒有影響到這個變數了。

sh-4.2# name="

hello world

"sh-4.2# [ $name = "

hello world"]

sh: [: too many arguments

sh-4.2# echo $?

2sh-4.2# [ "

$name

" = "

hello world"]

sh-4.2# echo $?

0sh-4.2# [[ $name = "

hello world"]]

sh-4.2# echo $?

0

這次變數是乙個片語了,帶空格那種了。當我們要測試時,結果發現bash回應引數太多了,這是怎麼回事呢?原來是單引號test命令對變數進行單詞分離了,結果也就變成了[ hello world = "hello world" ],多了那個字串hello,成了字串world和字串hello world之間的比較了。因此如果在單括號的test命令中的變數含有空格,但它還得和字串比較,那就必須給變數加個雙引號了,這時它就不會發生錯誤了。而在下面的雙括號的test命令中,即使變數含有空格又何妨,因為它不能對變數單詞進行分離。

2.單方括號的test命令,通常用內建的test命令來測試表示式的值,test命令也被鏈結到方括號上。這樣,既可以使用單獨的test命令,也可以通過把表示式用單方括號括起來,來測試表示式的值。

sh-4.2# ls -lah test 

-rw-r--r-- 1 root root 6 dec 17

15:51

test

sh-4.2# test -r test ; echo $?

0sh-4.2# [ -r test ]; echo $?

0

3.單括號的test命令不對shell元字元進行擴充套件的,而雙括號test命令則會對shell元字元進行擴充套件的了。言外之意,雙中括號支援正則。

sh-4.2# name=tom

sh-4.2# [ $name = t??]

sh-4.2# echo $?

1sh-4.2# [[ $name = t??]]

sh-4.2# echo $?

0

4.在雙括號的test命令當中,如果乙個字串(不管含不含有空格)僅僅是在表示式中作為乙個普通字串,而不是乙個模式的一部分,則它也必須用引號括起來。

我的理解是如果乙個字串值(右邊那個的了)不加雙引號,那這個字串就是模式來的,如果它裡面有含有shell元字元,bash會對它進行擴充套件。如果字串加了雙引號,那它就是乙個很普通的字串的,即便字串裡面裡面含有特殊字元,也就是當普通內容來處理。

sh-4.2# name=tomm

sh-4.2# [[ $name =tom ]]

sh-4.2# echo $?

1sh-4.2# name=tom

sh-4.2# name1=tomm

sh-4.2# [[ $name =tom ]]

sh-4.2# echo $?

0sh-4.2# [[ $name = tom?]]

sh-4.2# echo $?

1sh-4.2# [[ $name1 =tom ]]

sh-4.2# echo $?

1sh-4.2# [[ $name1 = tom?]]

sh-4.2# echo $?

0sh-4.2# [[ $name = "

tom"

]]sh-4.2# echo $?

0sh-4.2# [[ $name = "

tom?"]]

sh-4.2# echo $?

1sh-4.2# [[ $name1 = "

tom"

]]sh-4.2# echo $?

1

5.[ express1 –a express2 ] 這是放在單括號的test命令中的,因為單的不支援元字元擴充套件,因此就只能叫做表示式了,它們可以組合構成邏輯測試的,不過與或非使用( -a –o !)的形式。

sh-4.2# ls -lah test 

-r--r--r-- 1 root root 6 dec 17

15:51

test

sh-4.2# [ -r test -a -x test ]

sh-4.2# echo $?

1

[[pattern1 –a pattern1]] 這是放在雙括號test命令中的,因為單條式子可以支援元字元嘛,所以可以叫做模式表示式了,也就可以用於復合邏輯了,不過與非或使用(&& || !)的形式了。

sh-4.2# echo

$name

tomsh-4.2# [[ $name = [tt]om && $name = t??]]

sh-4.2# echo $?

0

1、單小括號( ):把括號內的命令在另乙個shell執行,並把結果返回,左右不留空格,一般要帶字首 $;示例如下

sh-4.2# echo $(ls)1

test

sh-4.2# ls -lah

total

8.0k

drwxr-xr-x 2 root root 27 dec 17

17:51

.dr-xr-xr-x. 19 root root 268 dec 17

15:03

..-rw-r--r-- 1 root root 80 dec 17

17:51

1-r--r--r-- 1 root root 6 dec 17

15:51 test

2、雙小括號(( )) :整數比較、四則運算,括住的內容,完全符合c語言語法,一般要帶字首 $

sh-4.2# echo $((1+2

))3

大括號表示次數,示例如下

sh-4.2# cat

file

1234

11234

2345

22345

5678

12345678

sh-4.2# grep -e "1"

file --color

11234

中括號表示範圍,示例如下

sh-4.2# grep -e "

[1-4]

"file --color

1234

11234

2345

22345

12345678

小括號表示乙個完整的字串,示例如下

sh-4.2# grep -e "

(1234)

"file --color

1234

11234

12345678

shell中的括號

在編寫shell scripts時,經常會用到括號,各種括號,各種用法。一 括號 圓括號 1 單小括號。命令組。括號中的命令將會新開乙個子shell順序執行,所以括號中的變數不能夠被指令碼餘下的部分使用。括號中多個命令之間用分號隔開,最後乙個命令可以沒有分號,各命令和括號之間不必有空格。命令替換。等...

shell中的括號

一 括號 圓括號 1 單小括號。命令組。括號中的命令將會新開乙個子shell順序執行,所以括號中的變數不能夠被指令碼餘下的部分使用。括號中多個命令之間用分號隔開,最後乙個命令可以沒有分號,各命令和括號之間不必有空格。命令替換。等同於 cmd shell掃瞄一遍命令列,發現了 cmd 結構,便將 cm...

shell中的括號

假設我們定義了乙個變數為 file dir1 dir2 dir3 my.file.txt 拿掉第一條 及其左邊的字串 dir1 dir2 dir3 my.file.txt 拿掉最後一條 及其左邊的字串 my.file.txt 拿掉第乙個 及其左邊的字串 file.txt 拿掉最後乙個 及其左邊的字串...