linux shell中的變量類型?分字符串或者數字或者bool類型嗎? 參考: http://www.cnblogs.com/nufangrensheng/p/3477281.html
不分!
shell編程中 不分數據類型, 所有的變量都 是字符串. 要進行 數值 / 數字的 整數運算, 就要用let, expr, (( ))等方式進行!
另外, shell中 只能處理整數, 不能處理 浮點數. 要用浮點運算, 需要用bc 程序
雙小括號的使用
[foo@localhost ~]$ myfunc () {
> local i=0
> (( i++ ))
> echo $i
> }
[foo@localhost ~]$ myfunc
1
[foo@localhost ~]$ myfunc () { local i=0; (( ++i )); echo $i; }
[foo@localhost ~]$ myfunc
1
[foo@localhost ~]$ myfunc () { local i=0; (( --i )); echo $i; }
[foo@localhost ~]$ myfunc
-1
[foo@localhost ~]$ myfunc () { local i=0; ((--i)); echo $i; }
[foo@localhost ~]$ myfunc
-1
[foo@localhost ~]$
miscellaneous雜項
-
$! 和!$的區別, 只要搞清楚, 以$開頭的表示 是變量, 是特殊變量, 而以! 開頭的是 "歷史命令 designator指示器" 就能夠分清楚了,所以$! 是 顯示 上一次"后台運行的"命令的pid進程id,注意是后台運行的進程id, 如果不是后台運行的,則是當前shell進程中執行命令, 所以
echo $!
就是顯示為空的. 那么用 echo $$ 就可以顯示當前進程的pid:
而!$ 則是表示上一次命令的參數. -
print和 printf的區別?
shell中沒有print這個命令!
只有printf這個命令,格式是:printf <format> [args], 格式中 \n是換行, 默認的printf是不換行的. %s是輸出字符串. %d其實也沒有用.
-
let是返回 被賦值的 變量的內容, 如果沒有變量被賦值, 則返回的是 多個表達式中, 最后一個表達式的值. 而expr才是返回 表達式的值.
-
定義函數/ 執行多個命令序列的時候, 如果寫在 同一行中, 一定要 在每條命令的最后 加上 分號, 否則會出錯.
-
eval命令?
eval主要是用在"復雜變量" "間接引用變量"的解析上, 會對命令行進行 兩次掃描, "兩次解析", 第一次進行變量的值替換, 第二次是對替換后的 內容進行解析"執行", 如果替換后的內容,是可以執行的命令, 則執行該命令; 如果是可以顯示的變量, 則輸出該變量的值.
eval后要不要 echo?
注意, 如果是替換后的"字符串內容"是可以執行的命令, 則不要echo, 否則還是顯示字符串, 而不是執行命令
如果替換后的內容是 變量, 通常是: "$$x", 前一個$是轉義表示本義的$, 后面的$x則是要替換的變量. 這時則要用 echo.
#!/bin/bash要加空格嗎?
在.sh腳本中, 第一行是 #!/bin/bash. 通常在#! 和/bin/bash之間不要加空格. 你所看到的基本都沒有的.雖然加上空格也沒有什么區別, 但是顯得不正規.
在雙引號(( i=0; i<$j; i++ )) 中, 最后一個語句 i++ 一定不能加 分號, 否則會報錯, 而其中的變量引用 $j可以 可以不加$. 但是 i<$j中, i不能加$, 否則會出錯
下面是一個打印三角形的小片段:
#!/bin/bash
# print reverse triangle stars
read -p 'enter star lines: ' line
for (( i=1; i<$line; i++ )) //i++ 后面不能加分號, 否則會出錯, 里面的$line,$可以省略; i=1, 這里i要從1 開始, 以免在下面打印星號的時候, 第一行會打印出空行
do
# print spances before stars
for (( nspace=line-i; nspace>0; nspace-- ))
do
echo -n ' '
done
# print stars
for (( j=2*i-1; j>0; j-- ))
do
echo -n '*'
done
echo // 這里的echo是為了換行
done
注意, 在C 語言中, 每個語句后面都要加分號, 必須的! 但是, shell語句, 如果單獨一行的話, 是可以/不必加分號的, 但是如果多個語句在一行, 則必須要加分號.
bash中的雙中括號 [[ ]] 用法 參考: http://www.cnblogs.com/xkfz007/archive/2011/10/13/2209563.html https://www.dwhd.org/20150708_211624.html http://www.jb51.net/article/60326.htm
- 雙中括號, 僅僅是: 單中括號的擴展. 兩個方面的內容
一是: 可以用於字符串的比較, (像1, 2, 10, 20)等, 只要不是在 let expr中, 都是字符串, 可以叫 "數字字符串", 數字字符串的比較 跟 "數值比較, 數學比較" 是一樣的. 用於條件判斷. 可以使用於 關系比較和邏輯運算.
shell中的變量其實還是分 數據類型的, 根據你的操作命令,和 操作方式, 共有三種: 整數變量, 字符串變量, 文件變量.
shell中雙小括號的用法, 有了雙小括號, [[, [, test邏輯運算和let express等都 可以拋到一邊了.
shell中的大括號的使用
第一, 作為"模板變量替換"使用 參考: https://www.dwhd.org/20150708_211624.html
大括號用來表示替換, 有點類似於php等腳本語言中的模板變量替換, 這種變量替換, 必須在大括號前面加上$符號(加上$符號, 這樣才算是一個變量!), 才能替換, 否則,不會替換,而只是把整個大括號的內容作為一個整體的命令來解析.
注意, 整個${var:C string}, 只是替換, 最后 這個整體得到的是, 只是替換后的一個 字符串! 注意只是一個字符串, 因此, 你要用另外的命令, 來操作這個字符串, 否則, 只有字符串, shell會提示: "stirng is not a command! "
注意, 后面的替換字符串, 如果只是一個單詞, 則可能會執行, 但是, 如果是帶有 參數的 多個單詞 的命令, 則可能不會執行!
${var: C string }
, 這個表示的是 替換. 意思是當條件C 滿足時,才用string替換, 否則就不 替換(還是為$var的值)
其中: -: 表示var為空的時候, 替換,
+: 表示var不為空的時候替換
=: 表示var為空的時候, 替換, 而且var 被替換為string.
? : 表示判斷var是否為空, 如果不為空, 就等於$var的值, 如果為空, 就從標准錯誤輸出string的值, 然后退出.
${var:C string}, 的string, 不一定只是變量 , 還可以是 $var, 也可以是 一個命令的輸出.
比如:
echo ${var:-$foo}
echo ${var:-$(date +%F)} 其中%F, 表示, full date, 完全/全部日期, %F = %Y-%m-%d.
但是需要注意的是, 在替換表達式中, 各個符號之間不能由空格, 否則,就返回 空字符串:
第二, 大括號表示模式刪除, 模式去除. 其中 %表示去掉以模式結尾的部分; # 表示去除以模式開始的部分. 兩個符號%%, ## 則是貪婪(最大化)匹配.
第三, 大括號表示"分配律", 分別多次多項匹配:
{1,2,3,a,b} =1, 2, 3, a,b {1, 2, 3}.txt= 1.txt 2.txt 3.txt
{1..5}.txt=1.txt 一直到 5.txt.
中括號表示多個中的一個, 而大括號表示所有的大括號中的項目都有效.
注意的是, 表示分配綠的各項之間不能有空格, 否則大括號表示的意義就沒有了. 表示范圍的.., 前后的兩項要是單個的數字或字母, 不能是雙個的字母,因為雙個的字母沒有辦法排序.