從shell眼中看世界
echo-顯示一行文本
當輸入一個命令,bash在執行命令之前,會對輸入的字符做展開處理。
路徑展開
echo *
shell將*展開爲當前目錄下的文件名稱,會打印出當前目錄下的文件名稱,
echo d* 打印出當前目錄下所有以d開頭的文件
echo *d 打印出當前目錄下所有以d結尾的文件
~展開
echo ~ 打印出當前用戶的家目錄信息
echo ~test 打印出test用戶的家目錄信息
算術表達式展開
echo $((expression))
echo $(((2*3)+5))
echo $(((2**3)*5))
注意表達式的格式,算術表達式只支持整數和加減乘除、取餘、冪運算。
花括號展開
從一個花括號的模式中創建多個文本字符串
echo hello{1,2,3} 將會輸出hello1 hello2 hello3
echo hello {1,2,3} 將會輸出hello 1 2 3
echo hello{a,b,c} 將會輸出helloa hellob helloc
注意:{}中的元素要用,分隔,可以是字符,也可以是字符串
最常見的應用是創建一系列的文件或目錄
mkdir hello{1,2,3,4,5}
參數展開
echo $USER 打印出用戶名
查看變量列表
printenv |less
當展開的變量是不存在的時候,系統會將其展開成爲一個空字符串
echo $HELLO
命令替換
將一個命令的輸出作爲展開式
echo $(ls)
ls -l $(which cp) 將whic cp的輸出信息作爲ls的參數
或是
ls -l `which cp` 舊版的shell支持,倒引號
引用
echo hello world
將會在屏幕上打印出hello world
echo the total is $100.00
將會在屏幕上打印出 the total is 00.00
在第一個中,shell會刪除多餘的空格,在第二個中,$會對1進行變量展開,而1並不是變量,所以會將其展開成爲空字符串
shell提供了一種引用的機制,它會有效的控制字符的展開
雙引號
第一種引用類型來控制字符的展開
如果在文本兩端添加””,那麼文本中除了$ \ `(倒引號)外,其他字符都將不會有特殊展開含義
在雙引號中,參數展開、表達式展開、命令展開仍然有效
echo “$USER $((2**3)) $(ls)”
echo “hello world” 會打印出hello world
單詞分割機制
echo hello world
這時會輸出hello world
在默認情況下,單詞分割機制會在單詞中尋找空格、製表符、換行符,並把它們看作單詞之間的界定符,而每個單詞都是一個參數,在上例中就有兩個參數,打印出每個參數用空格界定
同樣,如果你輸入 echo $(cal)
那麼此時打印出的是一行有空格界定的數據,而不含有換行符
如果輸入 echo “hello world”
單詞分割被禁止,其實就是””內部的內容作爲一個參數存在,而不加””卻是兩個參數
看看 echo $(cal)與echo “$(cal)”的區別
單引號
第二種引用限制字符展開,單引號會限制所有字符的展開,所有的字符只有本身的含義,不存在特殊含義
轉義字符
用\來禁止特殊字符的展開,注意在單引號中\將失去作用
echo \”hello world\”
反斜槓轉義序列的使用
\a 發出警告聲;
\b 刪除前一個字符;
\c 最後不加上換行符號;
\f 換行但光標仍舊停留在原來的位置;
\n 換行且光標移至行首;
\r 光標移至行首,但不換行;
\t 插入tab;
\v 與\f相同;
例如\a響鈴
echo -e ‘\a’ -e選項來解釋轉義字符,雖然\在單引號中失去作用,但-e選項解釋了它
echo $’\a’
不能夠直接echo “\a”
最後學習一個-n選項
-n 不換行的輸出
Echo “hello”;echo “world” 此時會兩行輸出hello world
Echo -n “hello”;echo “world” 則會一行輸出helloworld