shell程式設計二

老虎死了还有狼發表於2024-09-22

4.3.4.2 特殊變數-狀態變數

1. windows下書寫的指令碼,指令碼檔案複製到Linux執行異常的故障案例

'''
現象:windows下書寫的指令碼,上傳到Linux執行報錯.
原因:windows下面的回車換行\r\n ,linux下面回車換行\n
解決:替換結束標記即可.dos2unix windows-->linux
'''

[root@ubuntu2204 /server/scripts/shell-pro]# bash check_n_t.sh 
check_n_t.sh: line 3: $'\r': command not found
check_n_t.sh: line 4: $'\r': command not found

# 替換結束標記
[root@ubuntu2204 /server/scripts/shell-pro]# dos2unix check_n_t.sh 
dos2unix: converting file check_n_t.sh to Unix format...

[root@ubuntu2204 /server/scripts/shell-pro]# 
[root@ubuntu2204 /server/scripts/shell-pro]# bash check_n_t.sh 
Usage: check_n_t.sh 使用者名稱
[root@ubuntu2204 /server/scripts/shell-pro]# 
[root@ubuntu2204 /server/scripts/shell-pro]# bash check_n_t.sh xk
xk 存在
[root@ubuntu2204 /server/scripts/shell-pro]# bash check_n_t.sh xk5
xk5 不存在
[root@ubuntu2204 /server/scripts/shell-pro]# 

2. 透過指令碼傳參方式輸入任何一個命令並執行,檢查這個 命令的執行結果是否正確。

分析:
  輸入命令(傳參)
  判斷指令碼引數個數如果為0則報錯與退出
  執行命令 $@
  檢查結果 $?
    if判斷如果是0,成功.輸出成功
    if判斷如果不是0,則失敗.顯示失敗.
  最後給成功和失敗提示加上顏色.

[root@Kylin-V10-sp3 /server/scripts/shell-pro]# cat check_scripts.sh 
#!/bin/bash
##############################################################
# File Name:check_scripts.sh
# Version:V1.0
# Author:xk
# Organization: none
# Desc:
##############################################################

scripts="$@"

if [ $# -eq 0 ];then
    echo '請輸入命令'
    exit
fi

${scripts} >/dev/null 2>&1

if [ $? -eq 0 ] ;then
    echo ${scripts}":執行成功"
else
    echo ${scripts}":執行失敗"
fi
[root@Kylin-V10-sp3 /server/scripts/shell-pro]# 
[root@Kylin-V10-sp3 /server/scripts/shell-pro]# sh check_scripts.sh 
請輸入命令
[root@Kylin-V10-sp3 /server/scripts/shell-pro]# 
[root@Kylin-V10-sp3 /server/scripts/shell-pro]# sh check_scripts.sh tree / -L 1   
tree / -L 1:執行成功
[root@Kylin-V10-sp3 /server/scripts/shell-pro]#  
[root@Kylin-V10-sp3 /server/scripts/shell-pro]# sh check_scripts.sh tre
tre:執行失敗

4.3.4.3 特殊變數-變數子串

  • 變數子串 parameter expension變數擴充套件
  • 格式${變數},寫為$變數形式無法識別
  • **作用:用於對變數處理,加工。(統計變數中字串數量,對變數內容進行替換,刪除。。。)
  • 應用:可以不用,如果使用效率高,格局開啟.
# 變數子串(parameter表示變數名字)     含義

# 基礎
${parameter} $para                   變數取值
${#parameter}                        # 統計字元長度(變數中有多少個字元)

# 刪除(開頭,結尾)                 word表示要刪除的內容
${parameter#word}                    # 從變數左邊開始刪除,按照最短(第1個)匹配刪除
${parameter##word}                   從變數左邊開始刪除,按照最長(貪婪)匹配刪除
${parameter%word}                    從變數右邊開始刪除,按照最短匹配刪除
${parameter%%word}                   從變數右邊開始刪除,按照最長匹配刪除

# 擷取(切片)類似於 cut -c
${var:5}
${var:5:2}                           # 從下標是5字元開始向後擷取2個字元

# 替換 閹割版的sed
${para/word/replace}                 # 把word替換為replace 僅替換第1個
${para//word/replace}                把word替換為replace 替換全部
4.3.4.3.1 練習
# 1.統計字串長度
[root@Kylin-V10-sp3 ~]# teacher=xiaoming
[root@Kylin-V10-sp3 ~]# echo ${#teacher}
8
[root@Kylin-V10-sp3 ~]# 

# 2. 刪除變數中的內容(僅影響輸出)
[root@Kylin-V10-sp3 ~]# teacher=xiaoming12345688
[root@Kylin-V10-sp3 ~]# echo $teacher
xiaoming12345688
[root@Kylin-V10-sp3 ~]# 
[root@Kylin-V10-sp3 ~]# echo ${teacher#xiaoming}
12345688
[root@Kylin-V10-sp3 ~]# echo ${teacher#x}
iaoming12345688
[root@Kylin-V10-sp3 ~]# echo ${teacher#i}
xiaoming12345688
[root@Kylin-V10-sp3 ~]# echo ${teacher#*x}
iaoming12345688
[root@Kylin-V10-sp3 ~]# echo ${teacher#*i}
aoming12345688
[root@Kylin-V10-sp3 ~]# echo ${teacher##*i}
ng12345688
[root@Kylin-V10-sp3 ~]# 
[root@Kylin-V10-sp3 ~]# dir=/etc/sysconfig/network-scripts/ifcg-eth0
[root@Kylin-V10-sp3 ~]# 
[root@Kylin-V10-sp3 ~]# echo ${dir##*/}
ifcg-eth0
[root@Kylin-V10-sp3 ~]# echo ${dir%/*}
/etc/sysconfig/network-scripts
[root@Kylin-V10-sp3 ~]#

# 3. 擷取(切片)
[root@Kylin-V10-sp3 ~]# echo ${teacher}
xiaoming12345688
[root@Kylin-V10-sp3 ~]# echo ${teacher:4}
ming12345688
[root@Kylin-V10-sp3 ~]# echo ${teacher:4:2}
mi
[root@Kylin-V10-sp3 ~]# echo ${teacher:4:}  # 無輸出

[root@Kylin-V10-sp3 ~]# echo ${teacher:4:30}
ming12345688
[root@Kylin-V10-sp3 ~]# echo ${teacher} | cut -c1-3
xia
[root@Kylin-V10-sp3 ~]# echo ${teacher} | cut -c1
x
[root@Kylin-V10-sp3 ~]# echo ${teacher} | cut -c1-20
xiaoming12345688
[root@Kylin-V10-sp3 ~]# 

# 4 替換
[root@Kylin-V10-sp3 ~]# echo ${teacher/i/o-}
xo-aoming12345688
[root@Kylin-V10-sp3 ~]# echo ${teacher/i/o}
xoaoming12345688
[root@Kylin-V10-sp3 ~]# echo ${teacher//i/o}
xoaomong12345688
[root@Kylin-V10-sp3 ~]# 

面試題

檢視程式碼
 '''
要求:bash for迴圈列印下面這句話中字母數大於6的單詞(崑崙萬維面試題)。
shell思路:
1. 指令碼建立變數存放內容或指令碼傳參
2. 處理下資料,把資料裡面的特殊符號替換為空格.
3. 迴圈+判斷.
4. 滿足條件則輸出
length() awk函式用於統計某一列或整行的字元數量
${#var}
'''

# 1.使用${#變數}
[root@Kylin-V10-sp3 /server/scripts/shell-pro]# cat check_str.sh 
#!/bin/bash
##############################################################
# File Name:check_str.sh
# Version:V1.0
# Author:xk
# Organization: none
# Desc:
##############################################################

#1. 指令碼建立變數存放內容或指令碼傳參
str0="We are the successors of socialism."

#2. 處理下資料,把資料裡面的特殊符號替換為空格.
str=${str0/./ }

# 3. 迴圈+判斷.
for i in $str
do
    # 4. 滿足條件則輸出
    if [ ${#i} -ge 6 ];then
        echo $i "長度大於6,為:" ${#i}
    fi
done

[root@Kylin-V10-sp3 /server/scripts/shell-pro]# 
[root@Kylin-V10-sp3 /server/scripts/shell-pro]# bash check_str.sh 
successors 長度大於6,為: 10
socialism 長度大於6,為: 9

# 使用awk
[root@Kylin-V10-sp3 /server/scripts/shell-pro]# echo "We are the successors of socialism." |xargs -n1 |awk -F"[ .]" 'length($1)>=6'
successors
socialism.
[root@Kylin-V10-sp3 /server/scripts/shell-pro]# echo "We are the successors of socialism." |xargs -n1 |awk -F '[ .]' '{print$1}'
We
are
the
successors
of
socialism
[root@Kylin-V10-sp3 /server/scripts/shell-pro]# echo "We are the successors of socialism." |xargs -n1 |awk -F '[ .]' '{print$1}' | awk 'length($1)>=6'
successors
socialism
[root@Kylin-V10-sp3 /server/scripts/shell-pro]# echo "We are the successors of socialism." |xargs -n1 |awk -F '[ .]' '{print$1}' | awk 'length($1)>=6 {print $1}'
successors
socialism
[root@Kylin-V10-sp3 /server/scripts/shell-pro]# 

'''
在 awk 命令列中,-v RS= 選項用於設定輸入記錄分隔符(Record Separator, RS)為空字串。這通常用於處理多行文字記錄,
其中記錄之間沒有明顯的分隔符(如換行符)。當 RS 被設定為空字串時,awk 會將連續的空白行視為記錄分隔符,或者更準確地說,
它會將任意長度的空白行序列視為單個記錄分隔符。

在Linux中,xargs命令是一個非常強大的工具,用於從標準輸入(stdin)構建並執行命令。xargs讀取來自標準輸入的資料,
然後將這些資料作為引數傳遞給指定的命令。-n1選項是xargs命令的一個重要選項,它告訴xargs每次只從輸入中讀取一個專案(即一個引數),
並將這個引數傳遞給指定的命令。
'''
[root@Kylin-V10-sp3 /server/scripts/shell-pro]# echo "We are the successors of socialism." | awk -vRS=" " 'length()>=6'
successors
socialism.
[root@Kylin-V10-sp3 /server/scripts/shell-pro]# 

4.3.4.3.2 變數子串-小結

  • 變數子串這部分整體熟悉: ${#變數} ${替換}
  • 掌握幾個:計算變數字串長度,替換。
  • 瞭解: 刪除,擷取.
  • man bash 搜尋 Parameter Expansion

4.3.4.4 特殊變數-變數擴充套件(設定預設值)

給變數設定預設值

格式

含義

${parameter:- word}

變數parameter沒定義或為空,把word作為預設值,不修改變數內容(輸出)

${parameter:=word}

變數parameter沒定義或為空,把word作為預設值,修改變數內容

${parameter:?word}

變數parameter沒定義或為空,顯示word,錯誤輸出

${parameter:+word}

變數parameter沒定義或為空,則啥也不做,否則把word替換變數內容

檢視程式碼
 # :-
# 空值或者未建立該變數
[root@Kylin-V10-sp3 /server/scripts/shell-pro]# echo $name  

[root@Kylin-V10-sp3 /server/scripts/shell-pro]# echo ${name:-xiaohong}
xiaohong
[root@Kylin-V10-sp3 /server/scripts/shell-pro]# echo $name

[root@Kylin-V10-sp3 /server/scripts/shell-pro]# name=xiao
[root@Kylin-V10-sp3 /server/scripts/shell-pro]# echo ${name:-xiaohong}
xiao
[root@Kylin-V10-sp3 /server/scripts/shell-pro]#

# :=
[root@Kylin-V10-sp3 /server/scripts/shell-pro]# echo $name1

[root@Kylin-V10-sp3 /server/scripts/shell-pro]# 
[root@Kylin-V10-sp3 /server/scripts/shell-pro]# echo ${name1:=xiaohong}
xiaohong
[root@Kylin-V10-sp3 /server/scripts/shell-pro]# echo $name1
xiaohong
[root@Kylin-V10-sp3 /server/scripts/shell-pro]# name1=xiaohua
[root@Kylin-V10-sp3 /server/scripts/shell-pro]# 
[root@Kylin-V10-sp3 /server/scripts/shell-pro]# echo $name1
xiaohua
[root@Kylin-V10-sp3 /server/scripts/shell-pro]# 

# :+
[root@Kylin-V10-sp3 /server/scripts/shell-pro]# echo $name3
xiaobai1
[root@Kylin-V10-sp3 /server/scripts/shell-pro]# 
[root@Kylin-V10-sp3 /server/scripts/shell-pro]# echo ${name3:+xiaobai}
xiaobai
[root@Kylin-V10-sp3 /server/scripts/shell-pro]# 
[root@Kylin-V10-sp3 /server/scripts/shell-pro]# echo $name3
xiaobai1
[root@Kylin-V10-sp3 /server/scripts/shell-pro]# 

4.3.4.5特殊變數小結

  • 為shell程式設計增光添彩.
  • 整體要認識。
  • man bash PARAMETERS

常用特殊變數

必會

瞭解

位置變數

$n $0 $# $@ $*

區別$@ $*

狀態變數

$?

$$ $_ $!

變數子串

${#parameter}

${parameter/x/y}

除了前面的${para#xxx}

變數擴充套件(變數預設值)

${para:-word}

4.4 變數總結

變數命名,要求
變數基礎操作,賦值,取值.
金庸新作 ${變數}
變數分類
  普通
  環境變數:
    PATH,LANG,PS1,UID
    export命令建立或修改環境變數
  特殊變數 $n $0 $# $* $@ $?

各種判斷條件:

eq                 # 等於
ne                 # 不等於
lt less than <     # 小於
le less equal <=   # 小於等於
gt great than >    # 大於
ge great equal >=  # 大於等於

4.5 變數賦值

4.5.1 變數賦值語句

4.5.1.1 向變數中寫入內容

賦值方法

格式

應用場景

直接賦值

name=xiaobai

大部分時候使用

命令結果賦值

hostname=`hostname`

獲取命令的結果 `` 或$()

指令碼傳參(透過指令碼命令行傳參進行賦值)

user_name=$1 指令碼的第1個引數

usernames=" $*"

一般用於命令列內容傳入指令碼中. 不想設定太多互動.

read互動式賦值

透過read命令實現

與使用者有個互動過程

讀取檔案內容賦值給變數

未來迴圈中說

指令碼讀取檔案的時候使用.

4.5.1.2 read

read透過互動式的方式進行賦值

-p

互動的時候提示資訊。

-t (timeout)

超過這個時間沒有操作,則自動退出.

-s

不顯示使用者的輸入.記錄密碼才用

4.5.1.3 基本用法

[root@Kylin-V10-sp3 /server/scripts/shell-pro]# read -p "請輸入使用者名稱: "  user
請輸入使用者名稱: root
[root@Kylin-V10-sp3 /server/scripts/shell-pro]#

4.5.1.4 不顯示使用者的輸入

[root@Kylin-V10-sp3 /server/scripts/shell-pro]# read -t5 -p "請輸入使用者名稱: " user
請輸入使用者名稱: [root@Kylin-V10-sp3 /server/scripts/shell-pro]# 
[root@Kylin-V10-sp3 /server/scripts/shell-pro]# 
[root@Kylin-V10-sp3 /server/scripts/shell-pro]# read -t5 -s -p "請輸入用密碼: " pwd
請輸入用密碼: [root@Kylin-V10-sp3 /server/scripts/shell-pro]# 
[root@Kylin-V10-sp3 /server/scripts/shell-pro]#

4.5.1.5 同時向2個變數賦值

# 類似 num1 num2: 2 3
[root@Kylin-V10-sp3 /server/scripts/shell-pro]# read -p "請輸入兩個數字,如:10 20:  " num1 num2
請輸入兩個數字,如:10 20:  2 3
[root@Kylin-V10-sp3 /server/scripts/shell-pro]# echo $num1 $num2
2 3
[root@Kylin-V10-sp3 /server/scripts/shell-pro]# 

書寫指令碼檢查輸入的域名(1個或多個)是否可 ping(透過read方式實現)

# 使用read的時候用$#接收變數

[root@Kylin-V10-sp3 /server/scripts/shell-pro]# cat check_url.sh 
#!/bin/bash
##############################################################
# File Name:check_url.sh
# Version:V1.0
# Author:xk
# Organization: none
# Desc:
##############################################################

read -p "請輸入ip或者域名:" ip

if [ ${#ip} -eq 0 ];then
    echo "ip或域名不能為空!!!"
    exit
fi

ping -c1 -W 2 ${ip} >/dev/null 2>&1

if [ $? -eq 0 ];then
    echo ${ip} "可以ping通"
else
    echo ${ip} "ping不通"
fi	

[root@Kylin-V10-sp3 /server/scripts/shell-pro]# bash check_url.sh
請輸入ip或者域名:qq.com
qq.com 可以ping通
[root@Kylin-V10-sp3 /server/scripts/shell-pro]# 

賦值方式

read

$1 $2 用$* 或$@接收(如:url="$@")

共同點

變數賦值

變數賦值

區別

與使用者互動的地方(一問一答)

命令列傳參,命令列指令碼後面指定.

5. Shell程式設計必知必會的運算

  • 目標:透過shell指令碼+awk和其他方式,實現在指令碼中進行統計與計算.
  • 主要內容:
    • 運算子.
    • 運算的命令和符號.

5.1 運算子

shell-運算子

含義

+

加法符號

-

減法符號
* 乘法符號
/ 除法符號

%

取餘,可以用於生成指定範圍的隨機數.

^或** 冪、指數

2^10=1024 10個2相乘.

i=i+1 i++

計數,計算次數

j=j+1 j+=1 (數字累加)

j=j+$1 j+=$1 (變數累加)

求和,累加

&&

並且,前一個命令執行成功,再執行後面的命令(判斷)

||

或者,前一個命令執行失敗了,再執行後面的命令(判斷)

檢視程式碼
 #1. % 生成指定範圍的隨機數.
#隨機的數字(n)對一個數字取餘可以得到0到n-1範圍的隨機數。
[root@Kylin-V10-sp3 /server/scripts/shell-pro]# echo $RANDOM%5 |bc
3
[root@Kylin-V10-sp3 /server/scripts/shell-pro]# echo $RANDOM%5 |bc
4
[root@Kylin-V10-sp3 /server/scripts/shell-pro]# echo $RANDOM%5
31826%5

# 2. &&
# 檢查目錄是否存在
[root@Kylin-V10-sp3 /server/scripts/shell-pro]# ls /etc/ >/dev/null 2>&1 && echo "目錄存在"
目錄存在

# 3. ||
# 沒有則建立
root@Kylin-V10-sp3 /server/scripts/shell-pro]# tree -L 1 /root/
/root/
├── 1.py
├── 1.sh
├── anaconda-ks.cfg
├── app
├── app2
├── awkprof.out
├── conf_2024-09-11_3.tar.gz
├── hosts
├── http-dns.pcap
├── initial-setup-ks.cfg
└── test

3 directories, 8 files
[root@Kylin-V10-sp3 /server/scripts/shell-pro]# ls /etc/abc/ >/dev/null 2>&1 || mkdir -p /root/abc/
[root@Kylin-V10-sp3 /server/scripts/shell-pro]# 
[root@Kylin-V10-sp3 /server/scripts/shell-pro]# tree -L 1 /root/
/root/
├── 1.py
├── 1.sh
├── abc
├── anaconda-ks.cfg
├── app
├── app2
├── awkprof.out
├── conf_2024-09-11_3.tar.gz
├── hosts
├── http-dns.pcap
├── initial-setup-ks.cfg
└── test

4 directories, 8 files
[root@Kylin-V10-sp3 /server/scripts/shell-pro]# 

5.2 運算方法⭐⭐⭐⭐⭐

運算的命/符號

說明

應用場景

awk

可以進行計算,帶小數,可以與shell指令碼進行變數傳遞

一般計算都可以用awk

bc

帶小數

一般計算都可以用bc. 需要安裝

expr

進行計算,整數

一般用於檢查輸入內容是否為數字(方法之一).

let

進行計算,整數,變數直接使用即可 用於計算i++

$(())

進行計算,整數,變數直接使用即可

$[]

進行計算,整數,變數直接使用即可

5.2.1 awk進行計算

5.2.1.1 在awk中使用shell變數

[root@Kylin-V10-sp3 ~]# awk -vn1=10 -vn2=20 'BEGIN{print n1+n2}'
30
[root@Kylin-V10-sp3 ~]# 
[root@Kylin-V10-sp3 ~]# num1=10
[root@Kylin-V10-sp3 ~]# num2=20
[root@Kylin-V10-sp3 ~]# 
[root@Kylin-V10-sp3 ~]# awk -vn1=$num1 -vn2=$num2 'BEGIN{print n1+n2}'
30

awk -v選項用於建立或修改awk中的變數。-v是shell指令碼與awk橋樑在awk中各種變數直接使用即可,不要加上$n1,如果加上了會被awk識別為取列.

5.2.2.bc

基本用法. -l顯示小數.

# 基本用法. -l顯示小數.
[root@Kylin-V10-sp3 /server/scripts/shell-pro]# echo 1+2 | bc -l
3
[root@Kylin-V10-sp3 /server/scripts/shell-pro]# echo 2^9 | bc -l
512
[root@Kylin-V10-sp3 /server/scripts/shell-pro]#

5.2.2.1 計算器

傳入指令碼中2個引數,進行計算,輸出結果。

思路

1. 使用者傳入2個引數
2. 判斷是否為數字,如果不是,顯示提示資訊然後指令碼結束.增加個判斷指令碼引數個數是2.(這個判斷與上面的重複,可以省略)
3. 進行計算,輸出結果(awk,bc)

awk實現

指令碼傳參&&互動式傳參
 # 1. 指令碼傳入引數

#!/bin/bash
##############################################################
# File Name:num_calc_param_awk.sh
# Version:V1.0
# Author:xk
# Organization: none
# Desc:
##############################################################

#vars
num1=$1
num2=$2

#判斷為整數
n1=`[[ $num1 =~ ^[0-9]+$ ]] && echo 0 || echo 1`  # 0 是整數
n2=`[[ $num2 =~ ^[0-9]+$ ]] && echo 0 || echo 1`

if [ $n1 -eq 1 -o $n2 -eq 1 ];then  # -o 在[]裡表示or
    echo "請輸入整數"
    exit
fi


# 計算
add=`awk -vn3=$num1 -vn4=$num2 'BEGIN {print n3 + n4}'`
subtract=`awk -vn3=$num1 -vn4=$num2 'BEGIN {print n3 - n4}'`
mult=`awk -vn3=$num1 -vn4=$num2 'BEGIN {print n3 * n4}'`
if [ $num2 -eq 0 ]; then
    echo  $num2 "不能作為除數"
else
    divide=`awk -vn3=$num1 -vn4=$num2 'BEGIN {print n3 / n4}'`
fi

# 輸出
cat <<EOF
$num1 + $num2 = $add 
$num1 - $num2 = $subtract
$num1 * $num2 = $mult
$num1 / $num2 = $divide
EOF
[root@Kylin-V10-sp3 /server/scripts/shell-pro]# 
[root@Kylin-V10-sp3 /server/scripts/shell-pro]# bash num_calc_param_awk.sh 
請輸入整數
[root@Kylin-V10-sp3 /server/scripts/shell-pro]# bash num_calc_param_awk.sh 10 20
10 + 20 = 30 
10 - 20 = -10
10 * 20 = 200
10 / 20 = 0.5
[root@Kylin-V10-sp3 /server/scripts/shell-pro]# 


# 2. 互動式傳入引數
#!/bin/bash
##############################################################
# File Name:num_calc.sh
# Version:V1.0
# Author:xk
# Organization: none
# Desc:
##############################################################

# 輸入
read -p "請輸入需要計算的內容,如: 100 20    " num1 num2

# 檢查是否為數字
n1=`[[ $num1 =~ ^[0-9]+$ ]] && echo 0 || echo 1`
n2=`[[ $num2 =~ ^[0-9]+$ ]] && echo 0 || echo 1`

if [ $n1 -eq 1 -o $n1 -eq 1 ];then  # n1 n2 只要一個不是整數就退出
    echo "請輸入整數"
    exit
fi

# 計算
add=`awk -vn3=$num1 -vn4=$num2 'BEGIN {print n3 + n4}'`
subtract=`awk -vn3=$num1 -vn4=$num2 'BEGIN {print n3 - n4}'`
mult=`awk -vn3=$num1 -vn4=$num2 'BEGIN {print n3 * n4}'`
if [ $n2 -eq 0 ];then
    divide=`awk -vn3=$num1 -vn4=$num2 'BEGIN {print n3 / n4}'`
else
    echo $num2 "不能作為除數"
fi

# 輸出
cat <<EOF
$num1 + $num2 = $add
$num1 - $num2 = $subtract
$num1 * $num2 = $mult
$num1 / $num2 = $divide
EOF

[root@Kylin-V10-sp3 /server/scripts/shell-pro]# 
[root@Kylin-V10-sp3 /server/scripts/shell-pro]# bash num_calc_read_awk.sh 
請輸入需要計算的內容,如: 100 20    100 40
100 + 40 = 10
100 - 40 = 60
100 * 40 = 4000
100 / 40 = 2.5
[root@Kylin-V10-sp3 /server/scripts/shell-pro]# 

bc實現

num_calc_read_bc.sh
 #!/bin/bash
##############################################################
# File Name:num_calc_read_bc.sh
# Version:V1.0
# Author:xk
# Organization: none
# Desc:
##############################################################

# 輸入
read -p "請輸入需要計算的內容,如: 100 20    " num1 num2

# 判端是否為整數
n1=`[[ $num1 =~ ^[0-9]+$ ]] && echo 0 || echo 1`
n2=`[[ $num2 =~ ^[0-9]+$ ]] && echo 0 || echo 1`

if [ $n1 -eq 1 -o $n2 -eq 1 ];then
    echo "請按照格式輸入整數"
fi

# 計算
add=`echo $num1 + $num2 | bc -l`
subtract=`echo $num1 - $num2 | bc -l`
mult=`echo $num1*$num2 | bc -l`

if [ $num2 -eq 0 ];then
    echo $num2 "不能為除數"
else
    devide=`echo $num1 / $num2 | bc -l`
fi

# 輸出
cat << EOF
$num1 + $num2 = $add
$num1 - $num2 = $subtract
$num1 * $num2 = $mult
$num1 / $num2 = $devide
EOF

[root@Kylin-V10-sp3 /server/scripts/shell-pro]# 
[root@Kylin-V10-sp3 /server/scripts/shell-pro]# bash num_calc_read_bc.sh 
請輸入需要計算的內容,如: 100 20    200 10
200 + 10 = 210
200 - 10 = 190
200 * 10 = 2000
200 / 10 = 20.00000000000000000000
[root@Kylin-V10-sp3 /server/scripts/shell-pro]# 

相關文章