shell指令碼:$(())與$()還有${}的區別
我們上一章介紹了 ( ) 與 { } 的不同,這次讓我們擴充套件一下,看看更多的變化:$( ) 與 ${ } 又是啥玩意兒呢?
在 bash shell 中,$( ) 與 ` ` (反引號) 都是用來做命令替換用(command substitution)的。
所謂的命令替換與我們第五章學過的變數替換差不多,都是用來重組命令列:
* 完成引號裡的命令列,然後將其結果替換出來,再重組命令列。
例如:
程式碼: |
|
|
如此便可方便得到上一星期天的日期了... ^_^
在操作上,用 $( ) 或 ` ` 都無所謂,只是我"個人"比較喜歡用 $( ) ,理由是:
1, ` ` 很容易與 ' ' ( 單引號)搞混亂,尤其對初學者來說。
有時在一些奇怪的字形顯示中,兩種符號是一模一樣的(直豎兩點)。
當然了,有經驗的朋友還是一眼就能分變兩者。只是,若能更好的避免混亂,又何樂不為呢? ^_^
2, 在多層次的複合替換中,` ` 須要額外的跳脫( \` )處理,而 $( ) 則比較直觀。例如:
這是錯的:
程式碼: |
|
|
原本的意圖是要在 command2 `command3` 先將 command3 提換出來給 command 2 處理,
然後再將結果傳給 command1 `command2 ...` 來處理。
然而,真正的結果在命令列中卻是分成了 `command2 ` 與 `` 兩段。
正確的輸入應該如下:
程式碼: |
|
|
要不然,換成 $( ) 就沒問題了:
程式碼: |
|
|
只要你喜歡,做多少層的替換都沒問題啦~~~ ^_^
不過,$( ) 並不是沒有斃端的...
首先,` ` 基本上可用在全部的 unix shell 中使用,若寫成 shell script ,其移植性比較高。
而 $( ) 並不見的每一種 shell 都能使用,我只能跟你說,若你用 bash2 的話,肯定沒問題... ^_^
接下來,再讓我們看 ${ } 吧... 它其實就是用來作變數替換用的啦。
一般情況下,$var 與 ${var} 並沒有啥不一樣。
但是用 ${ } 會比較精確的界定變數名稱的範圍,比方說:
程式碼: |
|
|
原本是打算先將 $A 的結果替換出來,然後再補一個 B 字母於其後,
但在命令列上,真正的結果卻是隻會提換變數名稱為 AB 的值出來...
若使用 ${ } 就沒問題了:
程式碼: |
|
|
不過,假如你只看到 ${ } 只能用來界定變數名稱的話,那你就實在太小看 bash 了﹗
有興趣的話,你可先參考一下 cu 本版的精華文章:
為了完整起見,我這裡再用一些例子加以說明 ${ } 的一些特異功能:
假設我們定義了一個變數為:
file=/dir1/dir2/dir3/my.file.txt
我們可以用 ${ } 分別替換獲得不同的值:
${file#*/}:拿掉第一條 / 及其左邊的字串:dir1/dir2/dir3/my.file.txt
${file##*/}:拿掉最後一條 / 及其左邊的字串:my.file.txt
${file#*.}:拿掉第一個 . 及其左邊的字串:file.txt
${file##*.}:拿掉最後一個 . 及其左邊的字串:txt
${file%/*}:拿掉最後條 / 及其右邊的字串:/dir1/dir2/dir3
${file%%/*}:拿掉第一條 / 及其右邊的字串:(空值)
${file%.*}:拿掉最後一個 . 及其右邊的字串:/dir1/dir2/dir3/my.file
${file%%.*}:拿掉第一個 . 及其右邊的字串:/dir1/dir2/dir3/my
記憶的方法為:
# 是去掉左邊(在鑑盤上 # 在 $ 之左邊)
% 是去掉右邊(在鑑盤上 % 在 $ 之右邊)
單一符號是最小匹配﹔兩個符號是最大匹配。
${file:0:5}:提取最左邊的 5 個位元組:/dir1
${file:5:5}:提取第 5 個位元組右邊的連續 5 個位元組:/dir2
我們也可以對變數值裡的字串作替換:
${file/dir/path}:將第一個 dir 提換為 path:/path1/dir2/dir3/my.file.txt
${file//dir/path}:將全部 dir 提換為 path:/path1/path2/path3/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 定義為非空值。 (保留空值及非空值)
${file:=my.file.txt} :若 $file 沒設定或為空值,則使用 my.file.txt 作預設值,同時將 $file 定義為非空值。 (保留非空值)
${file?my.file.txt} :若 $file 沒設定,則將 my.file.txt 輸出至 STDERR。 (保留空值及非空值))
${file:?my.file.txt} :若 $file 沒設定或為空值,則將 my.file.txt 輸出至 STDERR。 (保留非空值)
還有哦,${#var} 可計算出變數值的長度:
${#file} 可得到 27 ,因為 /dir1/dir2/dir3/my.file.txt 剛好是 27 個位元組...
接下來,再為大家介稍一下 bash 的組數(array)處理方法。
一般而言,A="a b c def" 這樣的變數只是將 $A 替換為一個單一的字串,
但是改為 A=(a b c def) ,則是將 $A 定義為組數...
bash 的組數替換方法可參考如下方法:
${A[@]} 或 ${A[*]} 可得到 a b c def (全部組數)
${A[0]} 可得到 a (第一個組數),${A[1]} 則為第二個組數...
${#A[@]} 或 ${#A[*]} 可得到 4 (全部組數數量)
${#A[0]} 可得到 1 (即第一個組數(a)的長度),${A[3]} 可得到 3 (第一個組數(def)的長度)
A[3]=xyz 則是將第 4 個組數重新定義為 xyz ...
諸如此類的....
能夠善用 bash 的 $( ) 與 ${ } 可大大提高及簡化 shell 在變數上的處理能力哦~~~ ^_^
好了,最後為大家介紹 $(( )) 的用途吧:它是用來作整數運算的。
在 bash 中,$(( )) 的整數運算子號大致有這些:
+ - * / :分別為 "加、減、乘、除"。
% :餘數運算
& | ^ !:分別為 "AND、OR、XOR、NOT" 運算。
例:
程式碼: |
|
|
在 $(( )) 中的變數,可用 $ 符號來替換,也可以不用,如:
$(( $a + $b * $c)) 也可得到 19 的結果
此外,$(( )) 還可作不同進位(如二進位制、八進位、十六進位制)作運算呢,只是,輸出結果皆為十進位制而已:
echo $((16#2a)) 結果為 42 (16進位轉十進位制)
以一個實用的例子來看看吧:
假如當前的 umask 是 022 ,那麼新建檔案的許可權即為:
程式碼: |
|
|
事實上,單純用 (( )) 也可重定義變數值,或作 testing:
a=5; ((a++)) 可將 $a 重定義為 6
a=5; ((a--)) 則為 a=4
a=5; b=7; ((a < b)) 會得到 0 (true) 的返回值。
常見的用於 (( )) 的測試符號有如下這些:
>:大於
<=:小於或等於
>=:大於或等於
==:等於
!=:不等於
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29446986/viewspace-1337254/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- shell指令碼頭,#!/bin/sh與#!/bin/bash的區別.指令碼
- shell指令碼的三種執行方式和區別指令碼
- 詳解shell中source、sh、bash、./執行指令碼的區別指令碼
- Linux shell指令碼中內聯輸入 <<- EOF和 <<EOF的區別Linux指令碼
- Shell指令碼介紹與使用指令碼
- Python指令碼和網頁有什麼區別?Python指令碼網頁
- shell指令碼指令碼
- shell指令碼中不識別source命令指令碼
- Shell指令碼程式設計規範與變數(shell指令碼必須要知道的規矩!)指令碼程式設計變數
- linux常用的shell指令碼Linux指令碼
- shell指令碼案例指令碼
- 常用shell指令碼指令碼
- Linux Shell指令碼Linux指令碼
- shell指令碼(6)-shell陣列指令碼陣列
- 程式碼上線的shell指令碼指令碼
- shell與Linux命令有什麼區別?它們之間有聯絡嗎?Linux
- 檢測不同伺服器上程式碼差別的shell的指令碼伺服器指令碼
- linux shell指令碼中 =~ 的作用Linux指令碼
- shell 指令碼加密 | shc指令碼加密
- 執行shell指令碼指令碼
- Shell 指令碼語句指令碼
- 初識shell指令碼指令碼
- 【指令碼】shell語法指令碼
- shell 指令碼寫法:指令碼
- 如何加密shell指令碼加密指令碼
- shell指令碼總結指令碼
- 什麼是Shell指令碼?Shell指令碼在Linux運維工作中的地位!指令碼Linux運維
- Linux shell:執行shell指令碼的幾種方式Linux指令碼
- iOS逆向 Shell指令碼+指令碼重簽名iOS指令碼
- 2020-12-31 Linux Shell指令碼if else 與或的用法Linux指令碼
- 編寫shell指令碼的規範指令碼
- 幾例實用的Shell指令碼指令碼
- 如何編寫高效的 Shell 指令碼指令碼
- 如何呼叫python中的shell指令碼?Python指令碼
- shell指令碼的基礎知識指令碼
- Shell指令碼中的 /Dev/Null 用途指令碼devNull
- 在Linux中,Linux核心和Shell有何區別?Linux
- Python指令碼和網頁有什麼區別?差異介紹!Python指令碼網頁
- 終端和shell的區別