【轉】shell 大括號、圓括號的使用

在這里我想說的是幾種shell里的小括號,大括號結構和有括號的變量,命令的用法,如下:

PHP 代碼:
1.${var}?
2.$(cmd)?
3.(){}?
4.${var:-string},${var:+string},${var:=string},${var:?string}?
5.$((exp))?
6.$(var%pattern),$(var%%pattern),$(var#pattern),$(var##pattern)??

現在分述如下:
1.Shell中變量的原形:${var}
大家常見的變量形式都是$var,如

PHP 代碼:
$?var=test?
$?echo?$var?
test??

但當你要顯示變量值加隨意的字符(我這里用AA)時,就會出錯,如下:

PHP 代碼:
$?echo?$varAA?

$??

這時應該用變量的原形:${var},即是加一個大括號來限定變量名稱的范圍,如下

PHP 代碼:
$?echo?${var}AA?
testAA?
$??

以這個特性,我們可以很方便地寫一個批量改后綴名的程序,我把它命名為mymv,程序如下:

PHP 代碼:
#!/bin/bash?

tail=$1?
for?filename?in?`ls`?
do?
mv?$filename?${filename}.$tail?
done??

程序需要提供一個后綴名,如c,表示改為后綴為c的C程序文件,看下面的測試:

PHP 代碼:
$?ls?
a?b?c?
$?mymv?c?
$?ls?
a
.c?b.c?c.c?
$??

看樣子程序運行的很好,但這是不完善的程序,有2個要注意的問題:
A,目錄下沒有子目錄,如果有一個目錄,假設為dir,則也會被改為dir.c,這顯然不是我們想要的,應該修正這個程序能識別目錄。
B,沒有幫助對程序的參數進行處理,程序應該足夠友好,在用戶沒有給定后綴名時應能處理,像上面的將直接給文件加上了一個點(.),這顯然也不是我們想要的。

因為我們的目的是說明${var},這樣已經足夠了,因此這里不會再對上面的程序進行修正。

2.命令替換$(cmd)
命令替換$(cmd)和符號`cmd`(注意這不是單引號,在美式鍵盤上,`是ESC下面的那個鍵)有相同之處

PHP 代碼:
$?ls?
a?b?c?
$?echo?$(ls)?
a?b?c?
$?echo?`ls`?
a?b?c??

我們來分析一下命令echo $(ls),以便理解所謂命令替換是什么意思:
shell掃描一遍命令行,發現了$(cmd)結構,便將$(cmd)中的cmd執行一次,得到其標準輸出,再將此輸出放到原來命令echo $(ls)中的$(ls)位置,即替換了$(ls),再執行echo命令。
如下:
echo $(ls)被替換成了echo a b c
這里要注意的是$(cmd)中的命令的錯誤輸出是不會被替換的,替換的只是標準輸出:

PHP 代碼:
$?var=$(cat?d)?????###文件d在當前目錄不存在?
cat:?d:?沒有那個文件或目錄?
$?echo?$var?

$???????###顯然var變量的值是空的??

3.一串的命令執行()和{}
()和{}都是對一串的命令進行執行,但有所區別:
A,()只是對一串命令重新開一個子shell進行執行
B,{}對一串命令在當前shell執行
C,()和{}都是把一串的命令放在括號里面,并且命令之間用;號隔開
D,()最后一個命令可以不用分號
E,{}最后一個命令要用分號
F,{}的第一個命令和左括號之間必須要有一個空格
G,()里的各命令不必和括號有空格
H,()和{}中括號里面的某個命令的重定向只影響該命令,但括號外的重定向則影響到括號里的所有命令

我們來看幾個例子:

PHP 代碼:
$?var=test?
$?(var=notest;?echo?$var)???????###變量var值為notest,此是在子shell中有效?
notest?
$?echo?$var????????###父shell中值仍為test?
test?
$?{?var=notest;?echo?$var;}?????###注意左括號和var之間要有一個空格?
notest?
$?echo?$var?????????????????????###父shell中的var變量的值變為了notest?
notest?
$?{?var1=test1;var2=test2;echo?$var1>a;echo?$var2;}????###輸出test1被重定向到文件a中,?
test2????????????????###而test2輸出則仍輸出到標準輸出中。?
$?cat?a?
test1?
$?{?var1=test1;var2=test2;echo?$var1;echo?$var2;}>a?????????????###括號內命令的標準輸出全部被重定向到文件a中?
$?cat?a?
test1?
test2??

4,幾種特殊的替換結構:${var:-string},${var:+string},${var:=string},${var:?string}
A,${var:-string}和${var:=string}
若變量var為空,則用在命令行中用string來替換${var:-string},否則變量var不為空時,則用變量var的值來替換${var:-string}
如:

PHP 代碼:
$?echo?newvar?

$?echo?${newvar:-a}?
a?
$?echo?newvar?????????????###變量newvar的值仍然是空,但上一命令行中${newvar:-a}被替換成了a?

$?newvar=b?
$?echo?${newvar:-a}???????###變量newvar的值不為空時,此命令行中的${newvar:-b}被替換為$newvar,即b?
b?
$??

對于${var:=string}的替換規則和${var:-string}是一樣的,所不同之處是${var:=string}若var為空時,用string替換${var:=string}的同時,把string賦給變量var:

PHP 代碼:
$?echo?newvar?

$?echo?${newvar:=a}?
a?
$?echo?newvar???????????###變量newvar被賦值為a,同時${newvar:=a}被替換成a?
a?
$?echo?${newvar:=b}?????###變量newvar不為空(其值已被賦為a),則${newvar:=b}被替換為newvar的值(即b)?
a?
$?echo?$newvar?
a??

${var:=string}很常用的一種用法是,判斷某個變量是否賦值,沒有的話則給它賦上一個默認值。
如設置默認的編輯器:

PHP 代碼:
echo?You?use?editor:?${EDITOR:=/bin/vi}??

B,${var:+string}
${var:+string}的替換規則和上面的相反,即只有當var不是空的時候才替換成string,若var為空時則不替換或者說是替換成變量 var的值,即空值。(因為變量var此時為空,所以這兩種說法是等價的)

PHP 代碼:
$?echo?$newvar?
a?
$?echo?${newvar:+b}?
b?
$?echo?$newvar?
a?
$?newvar=?
$?echo?${
newvar:+b}?

$??

C,${var:?string}
替換規則為:若變量var不為空,則用變量var的值來替換${var:?string};若變量var為空,則把string輸出到標準錯誤中,并從腳本中退出。我們可利用此特性來檢查是否設置了變量的值。

PHP 代碼:
$?newvar=?
$?echo?${
newvar:?沒有設置newvar的值}?
bash:?newvar:?沒有設置newvar的值?
$?newvar=a?
$?echo?${newvar:?沒有設置newvar的值}?
a?
$??

補充擴展:在上面這五種替換結構中string不一定是常值的,可用另外一個變量的值或是一種命令的輸出。

PHP 代碼:
$?echo?${var:-`date`}?
日?3月?6?02:10:39?CST?2005?
$?echo?${var:-$(date)}?
日?3月?6?02:11:46?CST?2005?
$?a=test?
$?echo?${var:-$a}?
test?
$??

5.POSIX標準的擴展計算:$((exp))
這種計算是符合C語言的運算符,也就是說只要符合C的運算符都可用在$((exp)),甚至是三目運算符。
注意:這種擴展計算是整數型的計算,不支持浮點型.若是邏輯判斷,表達式exp為真則為1,假則為0。

PHP 代碼:
$?echo?$((3+2))?
5?
$?echo?$((3>2))?
1?
$?echo?$((25<3???2:3))?
3?
$?echo?$var?

$?echo?$((var=2+3))?
5?
$?echo?$var?
5?
$?echo?$((var++))?
5?
$?echo?$var?
6?
$??

好了,上面的例子足夠了,這也表明了這種擴展運算是很強大的。

6.四種模式匹配替換結構:${var%pattern},${var%%pattern},${var#pattern},${var##pattern}
這四種結構的意義是:${var%pattern}和${var%%pattern}表示從最右邊(即結尾)匹配的,${var#pattern} 和${var##pattern}從最左邊(即開頭)匹配的。其中${var%pattern}和${var#pattern}是最短匹 配,${var%%pattern}和${var##pattern}是最長匹配。只有在pattern中使用了通配符才能有最長最短的匹配,否則沒有最 長最短匹配之分。

結構中的pattern支持通配符,*表示零個或多個任意字符,?表示零個或一個任意字符,[...]表示匹配中括號里面的字符,[!...]表示不匹配中括號里面的字符。

PHP 代碼:
$?var=aabbbccbbdbb?
$?echo?${var%b}?
aabbbccbbdb?
$?echo?${var%%b}?
aabbbccbbdb?
$?echo?${var#a}?
abbbccbbdbb?
$?echo?${var##a}?
abbbccbbdbb?
$?echo?${var%*b}?
aabbbccbbdb?
$?echo?${var%%*b}?

$?echo?${var
#a*}?
abbbccbbdbb?
$?echo?${var##a*}?

$??

上面是簡單的例舉四種模式匹配替換結構的用法。

轉載于:https://www.cnblogs.com/DonkeyTomy/articles/2593667.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/377348.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/377348.shtml
英文地址,請注明出處:http://en.pswp.cn/news/377348.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

css clear屬性_CSS中的clear屬性

css clear屬性CSS | 清除財產 (CSS | clear Property) We know so much about float property and how it is used for styling our web pages. If you do not remember the float property, lets help jog your memory. The float property is used to set the elements in a …

linux find prune排除某目錄或文件

http://blog.csdn.net/ysdaniel/article/details/7995681 查找cache目錄下不是html的文件 find ./cache ! -name *.html -type f列出當前目錄下的目錄名,排除includes目錄,后面的-print不能少 find . -path ./includes -prune -o -type d -maxdepth 1 -print排除多個目錄,”(“…

嵌入式指針embedded pointer的概念以及用法

目錄前言概念用法參考前言 在針對一個class寫出它的內存管理池以及總結出allocator類(三個版本)中內存管理池的第二個版本中涉及到了一個非常重要的概念&#xff1a;嵌入式指針。同時嵌入式指針也在G2.9版本的alloc中出現。現在整理一下網上的一些用法和概念 概念 嵌入式指針…

CLI配置和編址

實施基本編址方案&#xff1a; 在設計新網絡或規劃現有網絡時&#xff0c;至少要繪制一幅指示物理連接的拓撲圖&#xff0c;以及一張列出以下信息的地址表&#xff1a; l 設備名稱 l 設計中用到的接口 l IP 地址和子網掩碼 l 終端設備&#xff08;如 PC&#xff09;的默…

sql語句中的in用法示例_PHP中的循環語句和示例

sql語句中的in用法示例循環 (Loops) Imagine that we need a program that says "hello world" 100 times. Its quite stressful and boring to write the statement -- echo "hello world" — 100 times in PHP. This is where loop statement facilitate…

love2d教程30--文件系統

在游戲里少不了文件操作&#xff0c;在love2d里我們可以直接用lua自帶的io函數&#xff0c;如果不熟悉可以先讀一下我的lua文件讀寫。 相對lua&#xff0c;love2d提供了更多的函數&#xff0c; 方便我們操作文件。不過可能處于安全考慮&#xff0c;love2d只允許我們訪問兩個目錄…

std::alloc具體細節

G2.9 std::alloc的缺點&#xff1a; 1、在alloc::deallocate中沒有將拿到的內存資源還給操作系統&#xff0c;在多任務中將占用很大資源 2、alloc::deallocate函數沒有檢查傳入的p指針的有效性。在這里它默認p為alloc::allocate取得。 如果p并非alloc::allocate取得&#xf…

修改函數的返回地址

這篇隨筆源自今天看的這篇文章http://www.cnblogs.com/bluesea147/archive/2012/05/19/2508208.html 1. 如何修改函數返回地址 今天主要寫測試程序思考和驗證了一下這個問題&#xff0c;先看一下這個&#xff23;程序 1 #include <stdio.h>2 void foo(){3 int a,…

調試JavaScript代碼

JavaScript調試代碼 (JavaScript debugging the code) Debugging is the process of finding mistakes or bugs in the program. There are several ways one can debug their JavaScript code. This article will walk you through the strict mode in JavaScript and excepti…

Delphi運算符及優先級

單目運算符 (最高優先級) 取變量或函數的地址(返回一個指針) not 邏輯取反或按位取反 乘除及按位運算符 * 相乘或集合交集 / 浮點相除 div 整數相除 mod 取模 (整數相除的余數) as 程序運行階段類型轉換 (RTTI運算符) and 邏輯或按位求和 shl 按位左移 shr 按位右移 加減運算符…

NotifyMyFrontEnd 函數背后的數據緩沖區(二)

message level 函數pq_putmessage調用 low level 函數 pq_putbytes,pq_putbytes調用 internal_putbytes。 從internal_putbyes上來看&#xff0c;就可以發現其數據發送的機制:有一個小技巧&#xff0c;如果數據緩沖區滿了&#xff0c;就發送&#xff0c;否則就先堆在那兒。如果…

從源碼角度剖析VC6下的內存分配與切割的運作

目錄前言1、heap初始化2、第一次分配內存&#xff0c;計算真正區塊大小3、new_region管理中心4、__sbh_alloc_new_group()切割第一次分配好的內存5、開始切割內存前言 malloc與free帶來的內存管理是應付小區塊的&#xff0c;即SBH(small block heap)&#xff0c;這點也可以從源…

windows常見命令整理(持續更新)

windows常見命令整理 1. 文件1.1. 實時顯示文件 logfile.txt 中新添加的內容&#xff08;類似于linux tail -f&#xff09; 2. 網絡2.1. netstat 3. 進程和任務3.1. tasklist &#xff08;用于列出當前運行的進程及其詳細信息&#xff09;3.2. wmic &#xff08;用于執行各種系…

最長公共子序列求序列模板提_最長公共子序列

最長公共子序列求序列模板提Description: 描述&#xff1a; This question has been featured in interview rounds of Amazon, MakeMyTrip, VMWare etc. 這個問題在亞馬遜&#xff0c;MakeMyTrip&#xff0c;VMWare等訪談輪次中都有介紹。 Problem statement: 問題陳述&…

洛必達法則使用條件

使用條件 1、分子分母同趨向于0或無窮大 。 2、分子分母在限定的區域內是否分別可導。 3、當兩個條件都滿足時&#xff0c;再求導并判斷求導之后的極限是否存在&#xff1a;若存在&#xff0c;直接得到答案&#xff1b;若不存在&#xff0c;則說明此種未定式無法用洛必達法則解…

求根號m(巴比倫算法)

巴比倫算法是針對求根號m的近似值情況的&#xff0c;它的思想是這樣的&#xff1a; 設根號mX0,則如果枚舉有答案X(X<X0)&#xff0c;則m/X>X0,當精度要求不高的時候&#xff0c;我們可以看成Xm/XX0,而如果精度要求比較高&#xff0c;我們只需取X和m/X的平均值作為新的枚舉…

Android面試題

http://blog.csdn.net/aomandeshangxiao/article/category/841452 http://www.cppblog.com/life02/category/18316.html轉載于:https://www.cnblogs.com/DonkeyTomy/articles/2598673.html

r語言 分類變量 虛擬變量_R語言中的變量

r語言 分類變量 虛擬變量R語言| 變數 (R Language | Variables) In the previous tutorial, we have come across the basic information that stands as a pavement for understanding the R language in depth. Now moving future let us educate ourselves about the concep…

算法題復習(快排、鏈表、二分、哈希、雙指針)

目錄1、快速排序復習2、鏈表部分復習203. 移除鏈表元素707. 設計鏈表206. 反轉鏈表142.環形鏈表 II3、二分法復習4、哈希法復習5、雙指針復習**15. 三數之和****18. 四數之和****27. 移除元素****344. 反轉字符串**,簡單&#xff0c;雙指針從兩側往中間靠攏&#xff0c;并隨時s…

Cassandra1.2文檔學習(7)—— 規劃集群部署

數據參考&#xff1a;http://www.datastax.com/documentation/cassandra/1.2/webhelp/index.html#cassandra/architecture/architecturePlanningAbout_c.html 當規劃一個Cassandra集群部署時&#xff0c;關于你初始存儲的數據的數據量你應當有一個好的想法&#xff0c;并且對于…