exprlinux
『壹』 linux借用外部命令expr,實現計算器功能,利用管道,進程
test指令(使用指令man查詢)
功能:檢查文件類型,值比較。
test的各種參數和使用。
test EXPRESSION1 –a EXPRESSION2
當表達式1和表達式2同時為真時值為真
test EXPRESSION1 –o EXPRESSION2
當表達式1或者表達式2為真時值為真
test –n STRING
或者
test STRING
當STRING串的長度不為零時值為真
test –z STRING
當STRING串長度為零時值為真
test STRING1 = STRING2
當STRING1和STRING2相同時值為真
test STRING1 != STRING2
當STRING1 和 STRING2不同時值為真
test INTEGER1 –eq INTEGER2
當INTEGER1等於INTEGER2時值為真
test INTEGER1 –ge INTEGER2
當INTEGER1大於或者等於INTEGER2時值為真
test INTEGER1 –gt INTEGER2
當INTEGER1 大於INTEGER2時值為真
test INTEGER1 –le INTEGER2
當INTEGER1小於等於INTEGER2時值為真
test INTEGER1 –lt INTEGER2
當INTEGER1 小於INTEGER2時值為真
test INTEGER1 –ne INTEGER2
當INTEGER1不等於INTEGER2時值為真
test FILE1 –ef FILE2
當FILE1和FILE2有同樣的device和inode號時為真(詳細見linux文件學習筆記)
test FILE1 –nt FILE2
當FILE1修改時間比FILE2新時值為真
test FILE1 –ot FILE2
當FILE1修改時間比FILE2舊時值為真
test –b FILE
FILE存在並且內容是block類型的
test –c FILE
FILE存在並且是字元類型的
test –d FILE
FILE存在並且是一個目錄
test –e FILE
FILE是否存在
test –f FILE
FILE存在並且是一個正則表達式類型的文檔
test –g FILE
FILE存在並且是 set-group-ID也就是SGID(詳細見後文學習筆記)
test –G FILE
FILE存在並且由有效的GROUP ID所擁有(詳細見後文學習筆記)
test –h FILE
FILE存在並且是一個符號鏈接(詳細見後文學習筆記)
test –k FILE
FILE存在並且設置了sticky bit set(詳細見後文學習筆記)
test –L FILE
FILE存在並且是一個符號鏈接
test –O FILE
FILE存在並且由一個有效的USER ID所擁有
test –p FILE
FILE存在並且是一個命名管道(命名管道見後文學習筆記)
test –r FILE
FILE存在並且授予了可讀的許可權
test –s FILE
FILE存在並且size大於0
test –S FILE
FILE存在並且是一個socket
test –t FD
文件的描述符FD在終端打開
test –u FILE
FILE存在並且SUID已經被設置
test –w FILE
FILE存在並且授予了寫操作許可權
test –x FILE
FILE存在並且授予了可執行的許可權
----------------------------------------------------------------------------------------------------------------------------------------------------
expr
expr是linux的手工命令行計數器,它可以幫助我們完成一些基本的表達式值運算。同時它也是一個字元串處理工具
(1) 整數運算
$expr ARG1 | ARG2
$expr ARG1 & ARG2
$expr ARG1 < ARG2
$expr ARG1 <= ARG2
$expr ARG1 = ARG2
$expr ARG1 != ARG2
$expr ARG1 >= ARG2
$expr ARG1 > ARG2
$expr ARG1 + ARG2
$expr ARG1 – ARG2
$expr ARG1 * ARG2
使用乘法時,需要使用反斜杠進行轉義
$expr ARG1 % ARG2
(2) 字元串操作
$expr length 「xxx」 //計算字元串長度
$expr substr 「this is a」pos length //從第pos位開始截取length長度的子串
$expr index 「tesr」e //獲取e在主串中首次出現的位置
(3) 增量計數
例子
loop=3
loop=`expr $loop + 1`
echo $loop
結果是4,在第二行代碼中,使用反引號,shell會將反引號中的內容作為一個系統命令,這樣一來,就好像我們在命令行內輸入了expr $loop + 1然後這個命令的返回結果被賦值到loop。
(4) 模式匹配(按照正則表達式模式匹配串)
通過指定冒號選項計算字元串中字元數。.*意即任何字元重復0次或多次。
> VALUE=account.doc
> expr $VALUE : 』.*』
8
在expr中可以使用字元串匹配操作,這里使用模式抽取.doc文件附屬名。
$expr $VALUE : 『\(.*\).doc』
accounts
(5) 其他
+ TOKEN
將TOKEN解釋為串,不管它是一個關鍵字或者一個操作符
延伸知識:
引號的作用
1 雙引號(「」)
1)使用」」可引用除字元$(美元符號)、`(反引號)、\(反斜線)外的任意字元或字元串。雙引號不會阻止shell對這三個字元做特殊處理(標示變數名、命令替換、反斜線轉義)。
Eg:name=gezn; echo 「User name:$name」//將列印User name :gezn
Echo 「The date is:`date +date-%d-%m-%Y`」//將列印The date is: 03-05-2009
Echo –e 「$USER\t$UID」 //將列印gezn 500
2)如果要查新包含空格的字元串經常用到雙引號
2 單引號(』』)
1) 如果用單引號把字元串括起來,則dayi9nhao內字元串中的任何特殊字元的特殊含義均被屏蔽。
2) 舉例:echo –e 『$USER\t$UID』//將列印$USER $UID(沒有屏蔽\t,是因為選項「-e」的緣故)
echo 『USER\t$UID』 //將列印$USER\t$UID
3 反引號(``)
1) shell將反引號中的內容作為一個系統命令,並執行其內容。使用這種方法可以替換輸出為一個變數
2) 舉例:a=`date + date-%d-%m-%Y` //將列印The date is: 03-05-2009
4.反斜線(\)
1)如果下一個字元有特殊含義,反斜線防止shell誤解其含義,即屏蔽其特殊含義。
2)下屬字元包含有特殊含義:& * + $ ` 「 | ?
3) 在列印字元串時要加入八進制字元(ASCII相應字元)時,必須在前面加反斜線,否則shell作普通數字處。
舉例: bj=Beijing; echo 」variable\$bj=$bj」//將列印variable $bj = beijing
------------------------------------------------------------------------------------------------------------------------------------------------
Shell特殊變數
在Shell中,預先定義了幾個有特殊含義的Shell變數,它們的值只能由Shell根據實際情況進行賦值,而不能通過用戶重新設置。shell的特殊變數包括它的位置和一些系統變數.
(一)常用位置變數:
$# 命令行上實際參數的個數,但不包含Shell腳本名。
$? 上一條命令執行後的返回值(也稱作 「退出碼」)。它是一個十進制數。多數Shell命令執行成功時,則返回值為0;如果執行失敗,則返回非0值。
$$ 當前進程的進程號。
$! 上一個後台命令對應的進程號,這是一個由1~5位數字構成的數字串。
$- 由當前Shell設置的執行標志名組成的字元串。例如:
set -xv 這個命令行給Shell設置了標志-x和-v(用於跟蹤輸出)。
$* 表示在命令行中實際給出的所有實參字元串,它並不僅限於9個實參。
$@ 它與$*基本功能相同,但是使用時加引號,並在引號中返回每個參數
$0 腳本名稱
$1..$9 第N個參數
下面的aaa bbb 為變數名
${aaa:-bbb} 如果$aaa為空或未定義,則取值$bbb.否則取值$aaa
${aaa:+bbb} 如果$aaa非空,則取值$bbb,否則取值為空
${aaa:=bbb} 如果$aaa非空,則取值$aaa,否則取值$bbb而且賦值(aaa=bbb)
${aaa:3} 如果aaa=abcdefg,則${aaa:3}的值為:defg ,相當於substr,計數從0開始
${aaa:3:2} 如上; ${aaa:3:2}取值為: de.相當於substr
${#aaa} 字元串$aaa的長度.
(二)常用系統變數:
$HOME 用戶的主目錄
$USER 用戶名稱
$GROUP 用戶所屬組名
$PATH 默認的搜索路徑
$HOSTNAME 主機名稱
$TZ 時區
$MAIL 存放郵件的路徑名
練手:
#!/bin/bash
echo $0
echo $*
echo $@
echo $#
echo $$
echo $_
在terminal窗口中執行:
./test.sh -a -b –c /home
./test.sh
-a -b -c /home
-a -b -c /home
4
3250
/home
區別$*和$@編寫如下test.sh腳本:
#!/bin/bash
function testargs
{
echo "$# args"
}
testargs "$*"
testargs "$@"
unset -f testargs
在terminal窗口中執行:
./test.sh -a -b /home
1 args //很明顯就一個嘛,傳入的是$*這個串,不是解釋後的參數
3 args //$@必須和引號搭配,所以結果正確
#!/bin/bash
function testargs
{
echo "$# args"
}
testargs $*
testargs $@
unset -f testargs
再次執行有:
./test.sh -a -b /home
3 args
3 args
作者:Aga.J
出處:http://www.cnblogs.com/aga-j
『貳』 使用 Linux 命令 expr/bc 進行數學運算
在Linux系統中,用於數學運算的命令主要有expr和bc。
expr命令,全稱為"evaluate expressions",主要用於整數計算和字元串處理,例如計算字元串長度、字元串比較、字元串匹配、字元串提取等。需要注意的是,expr僅支持整數,若需進行浮點數運算,應使用bc命令。
bc命令,全稱為"Basic Calculator",是一款強大的浮點數和高精度計算工具,適用於處理各種數學運算,包括加減乘除、指數運算、取模、求平方根等。其輸入和輸出方式類似於C語言,便於執行計算。
基本用法包括直接在終端中輸入表達式並按回車鍵獲得結果。對於浮點數運算,可以通過設置"scale"變數來控制小數點後的位數。bc還支持使用變數和函數進行更復雜的計算,例如定義函數來計算圓的面積。
在進行高級運算時,bc命令能夠執行浮點運算和一些高級函數,如設定小數精度、進行進制轉換及計算平方和平方根等。
expr與bc的主要區別在於,expr僅支持整數運算,而bc支持浮點數運算及整數運算,功能更加強大。