搭建Linux的基础命令符---bc
bc是一種算數(shù)語言,其語法和c語言類似,可以交互執(zhí)行。通過命令行選項可以獲得一個標(biāo)準(zhǔn)的數(shù)學(xué)庫。如果搭建請求,在處理任何文件之前定義數(shù)學(xué)庫。BC從處理所有文件的代碼開始。命令行中列出的文件按所列順序排列。在處理完所有文件后,BC從標(biāo)準(zhǔn)輸入中讀取。所有代碼都在讀取時執(zhí)行。(如果文件包含停止處理器的命令,BC將永遠(yuǎn)不會從標(biāo)準(zhǔn)輸入中讀取。
此命令的搭建適用范圍:RedHat、RHEL、Ubuntu、CentOS、SUSE、openSUSE、Fedora。
1、BC語法
?????bc??[ -hlwsqv ]??[long-options]??[??file ... ]?
???????????
2、選項列表
| 選項 | 說明 |
| -h | --help | 幫助信息 |
| -v | --version | 顯示命令版本信息 |
| -l | --mathlib | 定義標(biāo)準(zhǔn)數(shù)學(xué)庫 |
| -i | --interactive | 強制交互 |
| -w | --warn | 顯示POSIX的警告信息 |
| -s | --standard | 使用POSIX標(biāo)準(zhǔn)來處理 |
| -q | --quiet | 不顯示歡迎信息 |
?
3、說明
1)數(shù)據(jù)
bc中最基本的元素是數(shù)字。數(shù)字是任意精度的數(shù)字。這種精度既包括整數(shù)部分,也包括分?jǐn)?shù)部分。所有的數(shù)字在內(nèi)部用十進(jìn)制表示,所有的計算都用十進(jìn)制來表示。(此版本截斷除法和乘運算的結(jié)果。)數(shù)字有兩個屬性:長度和小數(shù)位。長度是數(shù)字中有效位的總數(shù),小數(shù)位是小數(shù)點之后的的有效位數(shù)。例如,0.000001的長度是6,小數(shù)位是6;1935.000的長度是7,小數(shù)位是3。
2)變量
數(shù)字存儲在兩種類型的變量中,簡單變量和數(shù)組。變量名稱以字母開頭,后面跟著任意數(shù)量的字母、數(shù)字和下劃線。所有字母都必須小寫。(全字母-數(shù)字名是擴展名。在POSIX bc中,所有名稱都是一個小寫字母。)變量的類型在上下文中是明確的,因為所有數(shù)組變量名稱后面都會有方括號([])。
有四個特殊的變量:scale、ibase、obase和last。scale定義了一些操作在小數(shù)點之后是如何使用數(shù)字的,默認(rèn)值是0。ibase和obase定義輸入和輸出數(shù)字的轉(zhuǎn)換基。默認(rèn)值都是基數(shù)10。last(擴展)是一個變量。它是最后打印的數(shù)字的值。所有這些變量可能都有分配給它們的值,以及表達(dá)式中使用的值。
3)注釋
bc中的注釋以字符“/*”開頭,以字符“*/”結(jié)尾。注釋可以從任何地方開始,并顯示為輸入中的單個空格。(這會導(dǎo)致注釋分隔其他輸入項。例如,在變量名的中間找不到注釋。)注釋包括注釋開始和結(jié)束之間的任何新行(行尾)。
為了支持bc腳本的使用,添加了行注釋作為擴展。行注釋從“#”字符開始,繼續(xù)到行的結(jié)束。行結(jié)束字符不是注釋的一部分,而是正常處理的。
如果命令行上的任何文件無法打開,bc將報告該文件不可用并終止。
4、關(guān)于表達(dá)式
這些數(shù)字由表達(dá)式和語句操作。由于語言設(shè)計為交互式,所以語句和表達(dá)式會盡快執(zhí)行。沒有“主”程序,而是在遇到時執(zhí)行代碼。
一個簡單的表達(dá)式只是一個常量。BC使用變量ibase指定的當(dāng)前輸入基將常量轉(zhuǎn)換為內(nèi)部十進(jìn)制數(shù)。(函數(shù)中有一個例外。)ibase的有效值為2到16,將超出此范圍之后,分配給ibase的值可能是2或16。輸入數(shù)字可能包含字符0-9和A-F。(注:它們必須是大寫字母,小寫字母是變量名稱。)無論ibase的值是多少,單數(shù)數(shù)字總是有該數(shù)字的值。(即A=10。)對于多位數(shù)字,bc將所有大于或等于ibase的輸入數(shù)字更改為IBASE-1的值。這使得FFF始終輸入的最大3位數(shù)。
完全表達(dá)式類似于許多其他高級語言。由于只有一種數(shù)字,所以沒有混合類型的規(guī)則。相反,有關(guān)于表達(dá)式精度的規(guī)則。每個表達(dá)式都有一個精度。這是從原始數(shù)字的精度、所執(zhí)行的操作以及在許多情況下變量scale的值導(dǎo)出的。變量scale的有效值為0到可由c語言整數(shù)表達(dá)的最大值。
在以下合法表達(dá)式的描述中,“expr”指的是一個完整的表達(dá)式,“var”指的是一個簡單的或數(shù)組變量。除非特別提到,結(jié)果的精度是所涉及的表達(dá)式的最大精度。
| 普通表達(dá)式 | 說明 |
| -expr | 結(jié)果是對表達(dá)式的否定。 |
| ++var | 變量增加1,而新值是表達(dá)式的結(jié)果 |
| --var | 變量減1,而新值是表達(dá)式的結(jié)果 |
| var++ | 表達(dá)式的結(jié)果是變量的值,然后變量增加1 |
| var-- | 表達(dá)式的結(jié)果是變量的值,然后變量減1 |
| expr * expr | 表達(dá)式的結(jié)果是這兩個表達(dá)式的乘積 |
| expr + expr | 表達(dá)式的結(jié)果是這兩個表達(dá)式的和 |
| expr – expr | 表達(dá)式的結(jié)果是這兩個表達(dá)式的差 |
| expr / expr | 表達(dá)式的結(jié)果是這兩個表達(dá)式的商。結(jié)果的精度是變量scale的值。 |
| expr % expr | 表達(dá)式的結(jié)果是“余數(shù)” |
| expr ^ expr | 表達(dá)式的結(jié)果是n次方,第二個表達(dá)式必須是整數(shù)。如果指數(shù)是負(fù)數(shù),那么結(jié)果的精度是scale |
| (expr) | 強制對表達(dá)式進(jìn)行計算 |
| var = expr | 變量就是表達(dá)式的值 |
| var <op>= expr | 相當(dāng)于“var=var<op>expr”,例如”var -= expr”?等價于“var=var-expr” |
| 關(guān)系表達(dá)式 | 關(guān)系表達(dá)式是一種特殊的表達(dá)式,計算結(jié)果總是0或1。如果關(guān)系為真,則計算為1;如果關(guān)系為假,則結(jié)果是0.。這些表達(dá)式可能出現(xiàn)在任何合法表達(dá)式中。(POSIX bc要求關(guān)系表達(dá)式僅用于if、while和語句,并且只能在其中進(jìn)行一次關(guān)系測試。) |
| expr1 < expr2 |
?????
| 關(guān)系表達(dá)式 | 關(guān)系表達(dá)式是一種特殊的表達(dá)式,計算結(jié)果總是0或1。如果關(guān)系為真,則計算為1;如果關(guān)系為假,則結(jié)果是0.。這些表達(dá)式可能出現(xiàn)在任何合法表達(dá)式中。(POSIX bc要求關(guān)系表達(dá)式僅用于if、while和語句,并且只能在其中進(jìn)行一次關(guān)系測試。) | ||
| expr1 < expr2 | expr1 <= expr2 | expr1 > expr2 | expr1 >= expr2 |
| expr1 == expr2 | expr1 != expr2 | expr1 && expr2 | expr1 || expr2 |
| !expr | |||
?????運算符的優(yōu)先級如下,從上到下依次增加:
| 運算符 | 結(jié)合方式 |
| || | 左結(jié)合 |
| && | 左結(jié)合 |
| ! | 不結(jié)合 |
| 關(guān)系運算符 | 左結(jié)合 |
| 賦值運算符 | 右結(jié)合 |
| +和- | 左結(jié)合 |
| *、/、% | 左結(jié)合 |
| ^ | 右結(jié)合 |
| 一元運算符?- | 不結(jié)合 |
| ++和-- | 不結(jié)合 |
選擇此優(yōu)先級是為了使符合POSIX的bc程序能夠正確運行。這將導(dǎo)致關(guān)系運算符和邏輯運算符在與賦值表達(dá)式一起使用時有一些不尋常的行為。例如下面的表達(dá)式:
a = 3<5
大多數(shù)C程序員會假設(shè)這會將“3<5”(值1)的結(jié)果賦給變量“a”,這在bc中所做的是將值3賦給變量“a”,然后比較3到5。在使用關(guān)系運算符和邏輯運算符與賦值運算符時,最好使用括號。
在bc中還提供了一些特殊的表達(dá)式。這些表達(dá)式與用戶定義的函數(shù)和標(biāo)準(zhǔn)函數(shù)有關(guān)。它們都以“名稱(參數(shù))”的形式出現(xiàn)。有幾個標(biāo)準(zhǔn)函數(shù):
1)length(expr),計算表達(dá)式結(jié)果的有效位數(shù)。
2)read(),Read函數(shù)(一個擴展)將從標(biāo)準(zhǔn)輸入中讀取一個數(shù)字,而不管該函數(shù)發(fā)生在何處。注意,這可能會導(dǎo)致標(biāo)準(zhǔn)輸入中的數(shù)據(jù)和程序混合出現(xiàn)問題。這個函數(shù)的最佳使用是在一個已經(jīng)編寫好的程序中,這個程序需要用戶輸入,但絕不允許從用戶輸入程序代碼。讀函數(shù)的值是從標(biāo)準(zhǔn)輸入中讀取的數(shù)字,使用轉(zhuǎn)換基的變量ibase的當(dāng)前值。
3)scale ( expr ),這個函數(shù)的值是expr表達(dá)式中小數(shù)點之后的位數(shù)。
4)sqrt ( expression ),函數(shù)的結(jié)果是表達(dá)式的開方值。
5、關(guān)于語句
?????語句(在大多數(shù)代數(shù)語言中)提供表達(dá)式計算的順序。在bc中,語句被“盡快”執(zhí)行。執(zhí)行發(fā)生在遇到的換行符的時候,并且有一個或多個完整的語句。由于這種立即執(zhí)行,換行符在bc中非常重要。事實上,分號和換行符都用作語句分隔符。如果換行符放置不當(dāng),將導(dǎo)致語法錯誤。因為換行符是語句分隔符,所以可以使用反斜杠字符隱藏?fù)Q行符。(<nl>)在bc中顯示為空格而不是新行。語句列表是由分號和換行符分隔的一系列語句。
?????1)表達(dá)式
?????這條語句做兩件事之一。如果表達(dá)式以“<變量><賦值>.”開頭,則被認(rèn)為是賦值語句。如果表達(dá)式不是賦值語句,則計算表達(dá)式并將表達(dá)式打印到輸出。在打印數(shù)字之后,將打印換行符。例如,“a=1”是一個賦值語句和“(a=1)”是一個具有內(nèi)嵌賦值的表達(dá)式。輸出基obase的有效值是2~BC_BASE_MAX。對于基數(shù)2至16,通常采用書寫數(shù)字的方法。對于大于16的基數(shù),bc使用多字符數(shù)字方法將每個較高的基數(shù)打印成以10為基數(shù)的數(shù)據(jù)。由于數(shù)字具有任意精度,一些數(shù)字可能無法在一條輸出線上打印。這些長數(shù)字將被分割,以“\”作為一行上的最后一個字符,每行打印的最大字符數(shù)為70個。由于bc的交互性,打印一個數(shù)字會導(dǎo)致最后將打印值賦值給特殊變量“l(fā)ast”的副作用。這允許用戶恢復(fù)打印的最后一個值,而不必重新鍵入打印數(shù)字的表達(dá)式。將last變量賦值為“最后一個值”是合法的,并將最后一個打印的值用指定的值覆蓋。新賦值將保持不變,直到打印下一個數(shù)字或?qū)⒘硪粋€值分配給“l(fā)ast”為止。
?????2)字符串
字符串被打印到輸出。字符串以雙引號開始,包含所有字符直到下一個雙引號字符。所有字符都是字面意思,包括任何換行符。字符串后不打印換行符。
?????3)打印列表
print語句(擴展)提供了另一種輸出方法?!發(fā)ist”是由逗號分隔的字符串和表達(dá)式的列表。每個字符串或表達(dá)式都按列表的順序打印。不打印終止換行符。表達(dá)式的將被計算出值,最后將其值打印并分配給變量“l(fā)ast”。打印語句中的字符串將打印到輸出中,并可能包含特殊字符。特殊字符以反斜杠字符“\”開始。bc識別的特殊字符是“a”(警報或鐘)、“b”(反斜杠)、“f”(表單提要)、“n”(換行符)、“r”(回車)、“q”(雙引號)、“t”(制表符)和“\”(反斜杠)。反斜杠后面的任何其他字符都將被忽略。
?????4)語句列表
?????這是復(fù)合語句。它允許將多個語句組合在一起執(zhí)行。
?????5)if (表達(dá)式)??statement 1??[else statement 2]
?????if語句根據(jù)表達(dá)式的值決定執(zhí)行statement 1或statement 2。如果表達(dá)式為非零,則執(zhí)行statement 1。如果存在statement 2,且表達(dá)式的值為0的時候執(zhí)行statement 2。
6)while ( expression )??statement
?????while語句將在表達(dá)式為非零時執(zhí)行語句。它在每次執(zhí)行語句之前計算表達(dá)式。循環(huán)的終止是由零表達(dá)式值或break語句的執(zhí)行引起的。
?????7)for ( [expression1] ; [expression2] ; [expression3] )??statement
?????for語句控制語句的重復(fù)執(zhí)行。表達(dá)式1是在循環(huán)之前計算的。表達(dá)式2是在每次語句執(zhí)行之前計算的。如果表達(dá)式2為非零,則計算語句;如果為零,則終止循環(huán)。每次執(zhí)行語句后,計算表達(dá)式3。在重新計算表達(dá)式2之前,如果未找到表達(dá)式1或表達(dá)式3,則不會在計算值的點上對其進(jìn)行任何計算。
?????8)break
?????break語句用來強制退出,通常用在for語句或者while語句中。
?????9)continue
?????continue語句用來結(jié)束本次循環(huán)。
?????10)halt
?????halt語句會導(dǎo)致bc程序退出。
?????11)return
?????函數(shù)返回0.
?????12)return expr
?????返回表達(dá)式的值。
?????13)偽語句,這些語句不會執(zhí)行,他們在編譯的時候才會起作用。下面列出偽語句
???????????a)limits,打印由于bc版本而產(chǎn)生的限制
???????????b)quit,遇到quit指令的時候就會退出bc,無論它出現(xiàn)在什么地方。例如“if (0 == 1) quit”就會導(dǎo)致退出bc
???????????c)warranty,打印較長的授權(quán)通知
6、函數(shù)
?????1)函數(shù)
?????bc中的函數(shù)總是計算一個值并將其返回給調(diào)用者。函數(shù)定義是“動態(tài)的”,在輸入中遇到定義之前,函數(shù)是未定義的。然后使用該定義,直到遇到相同名稱的另一個定義函數(shù)。然后,新定義取代舊的定義。函數(shù)定義方式如下:
???????????define name ( parameters ) { newline
????????????auto_list??statement_list }
函數(shù)的調(diào)用很簡單“name(parameters)”。
?????2)參數(shù)
?????參數(shù)是數(shù)字或數(shù)組。在函數(shù)定義中,可以有0個或者多個參數(shù),通過逗號分隔開。所有參數(shù)都是通過值參數(shù)調(diào)用的。數(shù)組是通過符號“name[]在參數(shù)定義中指定的。在函數(shù)調(diào)用中,實參是數(shù)字參數(shù)的完整表達(dá)式。相同的符號。數(shù)組的定義和傳值使用相同的符號。命名數(shù)組通過值傳遞給函數(shù)。由于函數(shù)定義是動態(tài)的,因此在調(diào)用函數(shù)時會檢查參數(shù)號和類型。參數(shù)數(shù)量或類型的不匹配都會導(dǎo)致運行時錯誤。對未定義函數(shù)的調(diào)用也會出現(xiàn)運行時錯誤。
?????3)auto_list
“auto_list”是供“本地”使用的變量的可選列表。auto_list的語法(如果存在)是“autoname,…;”。(分號是可選的。)每個名稱都是自動變量的名稱。數(shù)組可以使用與參數(shù)相同的表示法來指定。這些變量的值在函數(shù)開始時被推入堆棧中。然后將變量初始化為零,并在函數(shù)的整個執(zhí)行過程中使用。在函數(shù)退出時,這些變量被彈出,以便恢復(fù)這些變量的原始值(在函數(shù)調(diào)用時)。這些參數(shù)實際上是自動變量,它們被初始化為函數(shù)調(diào)用中提供的值。自動變量不同于傳統(tǒng)局部變量,因為如果函數(shù)A調(diào)用函數(shù)B,B可以使用相同的名稱訪問函數(shù)A的自動變量,除非函數(shù)B調(diào)用它們?yōu)樽詣幼兞?。由于自動變量和參?shù)被推到堆棧上,bc支持遞歸函數(shù)。
?????4)函數(shù)體
函數(shù)體是一系列bc語句的列表。同樣,語句用分號或換行符分隔。返回語句導(dǎo)致函數(shù)的終止和值的返回。返回語句有兩個版本。第一個形式“return”將值0返回給調(diào)用表達(dá)式。第二種形式“return (表達(dá)式)”計算表達(dá)式的值并將該值返回給調(diào)用表達(dá)式。在每個函數(shù)的末尾有一個隱含的“return (0)”。這允許一個函數(shù)終止并返回0,而不需要顯式返回語句。
函數(shù)還會改變變量ibase的用法。函數(shù)體中的所有常量都將在函數(shù)調(diào)用時使用ibase的值進(jìn)行轉(zhuǎn)換。在函數(shù)執(zhí)行過程中,ibase的更改將被忽略,但標(biāo)準(zhǔn)函數(shù)讀取除外,后者將始終使用ibase的當(dāng)前值來轉(zhuǎn)換數(shù)字。
?????當(dāng)前版本的bc,在函數(shù)中添加了幾個擴展。首先,定義的格式稍微放松了一些。標(biāo)準(zhǔn)要求開始大括號與定義關(guān)鍵字在同一行,所有其他部分必須在下面的行上。這個版本的bc將允許之前的任何數(shù)目的換行符。在函數(shù)的開頭支撐之后,例如,下面的定義是合法的:
define??d??(n)??{ return??(2*n); }
define??d??(n)
????????????{ return??(2*n); }
?????5)void類型
函數(shù)可以定義為void??蘸瘮?shù)不返回值,因此可能不會在任何需要值的地方使用??蘸瘮?shù)在輸入行調(diào)用時不會產(chǎn)生任何輸出。關(guān)鍵字void放在關(guān)鍵字定義和函數(shù)名稱之間。例如,請考慮下面的例子
define??py (y)??{ print "--->", y, "<---", "0; }
define??void??px (x)??{ print "--->", x, "<---", "0; }
py(1)
--->1<---
0???????????????????//由于py不是void,因此有默認(rèn)返回值,因此這里打印了它的返回值,
px(1)
--->1<---???????????//px是void類型,最后不會打印返回值
此外,還為數(shù)組添加了按變量調(diào)用。為了申明一個數(shù)組變量,函數(shù)中的數(shù)組參數(shù)是這樣定義的“*name[]”?。
7、數(shù)學(xué)庫
?????1)如果使用“-l”選項調(diào)用bc,則預(yù)加載一個數(shù)學(xué)庫,并將默認(rèn)精度設(shè)置為20。數(shù)學(xué)庫中有一下的函數(shù):
s(x),計算x的正弦值,x是弧度值。
c(x),計算x的余弦值,x是弧度值。
a(x),計算x的反正切值,返回弧度。
l(x),計算x的自然對數(shù)。
e(x),e的x次方。
j(n,x),從n到x的階數(shù)。
?????2)例子
下面的句子可以將“pi”的值賦值給shell變量pi
| pi = $(echo??"scale=10; 4*a(1)"??|??bc??-l) |
下面的句子就是數(shù)學(xué)庫中e的次方定義方式
| scale = 20 /* Uses the fact that e^x = (e^(x/2))^2 ????When x is small enough, we use the series: ????e^x = 1 + x + x^2/2! + x^3/3! + ... */ define e(x) { ????auto??a, d, e, f, i, m, v, z ????/* Check the sign of x. */ ????if (x<0) { ????????m = 1 ????????x = -x ????} ????/* Precondition x. */ ????z = scale; ????scale = 4 + z + .44*x; ????while (x > 1) { ????????f += 1; ????????x /= 2; ????} ????/* Initialize the variables. */ ????v = 1+x ????a = x ????d = 1 ????for (i=2; 1; i++) { ????????e = (a *= x) / (d *= i) ????????if (e == 0) { ????????????if (f>0) while (f--)??v = v*v; ????????????scale = z ????????????if (m) return (1/v); ????????return (v/1); ????????} ????????v += e ????} } |
?????下面的語句實現(xiàn)一個計算支票簿余額的簡單程序
| scale=2 print "\nCheck book program!\n" print "??Remember, deposits are negative transactions.\n" print "??Exit by a 0 transaction.\n\n" ? print "Initial balance? "; bal = read() bal /= 1 print "\n" while (1) { ????"current balance = "; bal ????"transaction? "; trans = read() ????if (trans == 0) break; ????bal -= trans ????bal /= 1 } quit |
?????下面的語句采用遞歸的方式計算x的階乘
| define f (x) { ????if (x <= 1) return (1); ????return (f(x-1) * x); } |
8、readline和libedit選項
?????可以編譯GNU bc(通過一個配置選項)來使用GNU readline輸入編輯器庫或bsd libedit庫。這允許用戶在將行發(fā)送到bc之前進(jìn)行編輯。它還允許保存以前鍵入的行的歷史記錄。當(dāng)選擇此選項時,bc還有一個特殊變量。變量“history”是保留的歷史記錄行數(shù)。對于readline,值-1表示不限制歷史記錄的行數(shù),0將禁用歷史記錄功能,默認(rèn)值為100。
9、差別
這個版本的bc是從POSIX P 1003.2/D11草案中實現(xiàn)的,包含了與草案和傳統(tǒng)實現(xiàn)相比的一些區(qū)別和擴展,它不是以傳統(tǒng)的方式使bc(1)實現(xiàn)的,這個版本是一個解析和運行程序字節(jié)代碼轉(zhuǎn)換的單一進(jìn)程。這里有一個“無文檔”選項(-c),它導(dǎo)致程序?qū)⒆止?jié)碼輸出到標(biāo)準(zhǔn)輸出,而不是運行它。它主要用于調(diào)試解析器和準(zhǔn)備數(shù)學(xué)庫。差異的一個主要來源是擴展,下面列出一些差異和擴展:
?????1)LANG環(huán)境變量,此版本在處理lang環(huán)境變量和從lc_開始的所有環(huán)境變量時不符合POSIX標(biāo)準(zhǔn)。
?????2)名字,傳統(tǒng)和POSIX bc都有用于函數(shù)、變量和數(shù)組的單字母名稱。它們被擴展為以字母開頭的多字符名稱,可以包含字母、數(shù)字和下劃線字符。
?????3)字符串,字符串不允許包含NUL字符。POSIX表示所有字符都必須包含在字符串中。
?????4)last,POSIX bc中沒有l(wèi)ast變量。
?????5)比較,POSIX bc只允許在if語句、while語句和for語句的第二個表達(dá)式中進(jìn)行比較。
?????6)if語句,POSIX bc中if語句沒有else。
?????7)for語句,POIX bc中要求for語句中的3個表達(dá)式都必須具備。
?????8)&&,||,!,POSIX bc中沒有邏輯運算。
?????9)read,POSIX bc沒有read功能。
?????10)打印語句,POSIX bc沒有打印語句。
?????11)continue語句,POSIX bc沒有continue語句。
?????12)return,POSIX bc要求return的表達(dá)式加括號。
?????13)數(shù)組參數(shù),POSIX bc不(目前)完全支持?jǐn)?shù)組參數(shù)。POSIX語法允許函數(shù)定義中的數(shù)組,但沒有提供將數(shù)組指定為實際參數(shù)的方法。(這很可能是語法上的疏忽。)傳統(tǒng)的bc實現(xiàn)只通過值數(shù)組參數(shù)進(jìn)行調(diào)用。
?????14)函數(shù),POSIX bc要求函數(shù)開頭的大括號和define關(guān)鍵字在同一行,語句在下一行。
?????15)=+, =-, =*, =/, =%, =^。POSIX bc不要求定義這些“舊樣式”賦值操作符。此版本可能允許這些“舊樣式”賦值。使用限制語句查看安裝的版本是否支持它們。如果它確實支持“舊樣式”賦值運算符,則“a=-1”語句將使a減少1,而不是將a設(shè)置為值-1。
?????16)數(shù)字中的空格,bc的其他實現(xiàn)允許數(shù)字空格。例如,“x=1 3”將值13賦值給變量x。相同的語句將導(dǎo)致bc版本中的語法錯誤。
?????17)錯誤和執(zhí)行,在程序中發(fā)現(xiàn)語法和其他錯誤時,此實現(xiàn)與其他實現(xiàn)的代碼不同。如果在函數(shù)定義中發(fā)現(xiàn)語法錯誤,則錯誤恢復(fù)機制將嘗試查找語句的開頭并繼續(xù)解析函數(shù)。一旦在函數(shù)中發(fā)現(xiàn)語法錯誤,該函數(shù)將不可調(diào)用并變?yōu)槲炊x。交互執(zhí)行代碼中的語法錯誤將使當(dāng)前執(zhí)行塊失效。執(zhí)行塊由在完整語句序列之后出現(xiàn)的行尾終止。例如
?????a = 1
?????b = 2
這個語句有兩個執(zhí)行塊,而下面的語句
?????{a = 1
?????b = 2}
只有一個執(zhí)行塊。任何運行時錯誤都會終止當(dāng)前的執(zhí)行塊,而警告則不會。
?????18)中斷,在交互會話期間,SIGINT信號(通常由終端上的“ctrl+c“生成)將導(dǎo)致當(dāng)前執(zhí)行塊的執(zhí)行中斷。它將顯示一個“運行時”錯誤,指示哪個功能被中斷。在所有運行時結(jié)構(gòu)被清除后,將打印一條消息通知用戶bc準(zhǔn)備好接收更多的輸入。所有先前定義的函數(shù)都保留定義,所有非自動變量的值是中斷點的值。在清理過程中,所有自動變量和函數(shù)參數(shù)都會被移除。對于一個非交互式會話,SIGINT信號將終止bc的整個運行。
10、限制
?????下面列出當(dāng)前bc程序的一些限制,有一些限制可能已經(jīng)被用戶修改過。
1)BC_BASE_MAX,最大輸出基設(shè)置為999。最大輸入基為16。
2)BC_DIM_MAX,這是當(dāng)前分布的65535以內(nèi)的任意限制,每個機器可能都不一樣。
3)BC_SCALE_MAX,小數(shù)點前后的位數(shù)都由INT_MAX限制。
4)BC_STRING_MAX,字符串中的字符字?jǐn)?shù)由INT_MAX限制。
5)exponent,指數(shù)運算中的指數(shù)值由LONG_MAX限制。
6)variable names,當(dāng)前對每個簡單變量、數(shù)組和函數(shù)名字的限制32767。
11、環(huán)境變量
?????下面的環(huán)境變量由bc程序來控制
1)POSIXLY_CORRECT,和“-s”選項一樣。
2)BC_ENV_ARGS,這是另一種獲取bc參數(shù)的機制。格式與命令行參數(shù)相同。這些參數(shù)是先處理的,因此環(huán)境參數(shù)中列出的任何文件在任何命令行參數(shù)文件之前都會被處理。這允許用戶設(shè)置“標(biāo)準(zhǔn)”選項和文件,以便在每次調(diào)用環(huán)境變量中的文件通常包含用戶希望在每次運行bc時定義的函數(shù)定義。
3)BC_LINE_LENGTH,這應(yīng)該是一個整數(shù),指定數(shù)字輸出行中的字符數(shù)。這包括用于長數(shù)字的反斜杠和換行符。,如果值是0,將禁用多行功能。此變量的任何其他值如果小于3,則將行長設(shè)置為70。
12、實例
?????1)簡單計算
| [root@192 ~]#?bc bc 1.06.95??????//歡迎語句 Copyright 1991-1994, 1997, 1998, 2000, 2004, 2006 Free Software Foundation, Inc. This is free software with ABSOLUTELY NO WARRANTY. For details type `warranty'.? 12+23????//輸入加法表達(dá)式,回車 35???????//得到結(jié)果 100/25???//輸入除法表達(dá)式,回車 4?????????//得到結(jié)果 quit?????//退出指令 [root@192 ~]#? |
?????2)執(zhí)行for循環(huán)語句
| for(i=0; i<3; i++){print "hello\n"}???//這是一個打印語句 hello hello hello |
總結(jié)
以上是生活随笔為你收集整理的搭建Linux的基础命令符---bc的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: php求1000以内的素数 10个一行,
- 下一篇: linux显示光盘命令行,使用wodim