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]#