shell腳本經典題之函式應用
文章目錄
- shell腳本經典題之函式應用
- 1、函式的概述:
- (1) 函式的定義:
- (2) 函式的使用:
- (3) 函式的回傳值:
- (4) 函式的引數:
- 2、shell函式例題--階乘計算:
- 3、shell函式--冒泡排序:
- 4、shell函式--選單合集:
- 總結:
1、函式的概述:
(1) 函式的定義:
和其他“真正”的編程語言一樣,如:Java,C語言,Python等,Bash也有函式,盡管它在實作方面有一些限制,
一個函式就是一個子程式,實作一些列操作的代碼塊,執行一個特定任務的“黑盒子”,
函式的格式:
function function_name {
command . . .
}
或者
function_name ( ) {
command. . .
}
(2) 函式的使用:
#!/bin/bash
demoFun(){
echo "這是我的第一個 shell 函式!"
}
echo "-----函式開始執行-----"
demoFun
echo "-----函式執行完畢-----"

注意:
(1)函式定義必須在第一次呼叫之前,
(2)函式同名時,呼叫函式則是呼叫后一個函式
(3)呼叫函式與函式的定義順序無關
#!/bin/bash
hh(){
w;h
}
h(){
echo "hello"
}
w(){
echo "world"
}
nihao(){
echo `w` `h`
}
h;w
nihao
hh

(3) 函式的回傳值:
函式回傳一個值,被稱為退出狀態碼,這和一條命令回傳的退出狀態碼 類似,
退出狀態碼可以由return 命令明確指定,也可以由函式中最后 一條命令的退出狀態碼來指定(如果成功,則回傳0,否則回傳非0 值),
可以在腳本中使用 $? 來參考退出狀態碼,
#!/bin/bash
user(){
if [ $USER=root ]
then
echo "你是管理員用戶"
else
echo "你不是管理員用戶"
return 1
fi
}
user

(4) 函式的引數:
在Shell中,呼叫函式時可以向其傳遞引數,在函式體內部,通過 $n 的形式來獲取引數的值,例如,$1表示第一個引數,$2表示第二個引數…
#!/bin/bash
#函式的引數例題
sum(){
echo "第一個數:" $1
echo "第二個數:" $2
let n=$1+$2
echo $n
}
sum $1 $2

2、shell函式例題–階乘計算:
#這有兩種方法:
#第一種是利用 for 回圈來階乘計算
#!/bin/bash
sum=1
read -p "請輸入你想要的數,使其階乘:" n
for(( i=2;i<=$n;i++ ))
do
sum=$[i * sum]
done
echo "1到 $n 的階乘為:$sum"
#第二種方法是函式呼叫自身,利用位置變數來傳參
fact(){
if [ $1 -eq 0 -o $1 -eq 1 ]
#如果$1 等于0或者1,等于1
then
echo 1
else
echo $[$1 * $(fact $[$1-1])]
#階乘 $1=$1x($1-1 的階乘)
fi
}
fact $1

3、shell函式–冒泡排序:
#!/bin/bash
#根據你想排序的位數,隨機輸入自己想要冒泡排序的數字:
arr=()
read -p "請輸入你想輸入的位數:" p
for (( n=1;n<=$p;n++ ))
do
read -p "請輸入第 $n 個數字:" t
arr[n-1]=$t
done
echo "----對數字 ${arr[*]} 進行冒泡排序----"
echo
for (( j=1;j<${#arr[*]};j++ ))
do
flag=1
for (( i=0;i<${#arr[*]}-j;i++ ))
do
if [ ${arr[i]} -gt ${arr[i+1]} ]
then
tmp=${arr[i]}
arr[i]=${arr[i+1]}
arr[i+1]=$tmp
flag=0
fi
done
if [ $flag -eq 1 ]
then
echo "經過 $j 輪比較,冒泡排序完成,"
break
fi
done
echo
echo " $p 個數冒泡排序后的順序為:${arr[*]}"
echo

4、shell函式–選單合集:

#!/bin/bash
#shell函式應用--選單合集
fire(){
echo "---關閉防火墻---"
systemctl disable firewalld
}
systemInfo(){
echo "系統資訊:"
name=`hostname`
ip=`ifconfig ens33|awk /netmask/'{print $2}'`
os=`cat /etc/redhat-release`
kernel=`uname -r`
cpu=`lscpu|grep 型號名稱:|tr -s " "|cut -d" " -f1 --complement`
mem=`free -hm | awk /Mem/'{print $2}'`
space=`lsblk | awk /disk/'{print $4}'|awk -F G '{print $1}'`
#這里是設定輸出時的字體顏色
G="\e[1;32m"
B="\e[1;34m"
E="\e[0m"
for i in $space
do let sum=$[$sum+$i]
done
echo -e "$B主機名:$E$G\t$name\t$E"
echo -e "${B}IP地址:$E$G\t$ip\t$E"
echo -e "$B系統版本:$E$G\t$os\t$E"
echo -e "$B內核版本:$E$G\t$kernel\t$E"
echo -e "${B}cpu名稱:$E$G\t$cpu\t$E"
echo -e "$B記憶體總大小$E:$G\t$mem\t$E"
echo -e "$B硬碟總大小$E:$G\t${sum}G\t$E"
}
yumadd(){
cd /etc/yum.repos.d
mkdir bak
mv *.repo bak/
echo "[abc]
name=abc
baseurl=file:///mnt
enable=1
gpgcheck=0" > abc.repo
mount /dev/sr0 /mnt
yum clean all
yum install tree -y
}
diskadd(){
lsblk
fdisk /dev/sdb <<EOF
m
n
p
+10G
p
w
EOF
lsblk
mkfs.xfs /dev/sdb1
if [ -e /tp ]; then
exit
fi
mkdir /tp
echo "/dev/sdb1 /tp xfs defaults 0 0" >> /etc/fstab
mount -a
df -hT
}
jiance(){
if [ $USER == "root" ]
then
echo "你是root用戶"
else
echo "你不是root用戶"
fi
}
biem(){
read -p "請輸入你要定義的別名:" bakname
echo "$bakname" >> /etc/bashrc
#shopt -s expand_aliases
#source /etc/bashrc
}
changeName(){
echo "修改主機名要重啟電腦才有效"
hostnamectl set-hostname swl
init 6
}
sshSet(){
ssh-keygen <<EOF
EOF
cd /root/.ssh
ls
read -p "請輸入要免密登入的主機IP(保證主機IP和本機IP處于同一網段):" ip
ssh-copy-id -i $ip <<EOF
yes
root
EOF
ssh $ip
}
PS3="請選擇專案(1-9):"
menu="
關閉防火墻
顯示系統資訊
搭建yum倉庫
磁盤自動磁區
檢測當前用戶
添加別名
更改主機名
使用ssh免密登錄
退出選單
"
select menu in $menu
do
case $REPLY in
1)
fire
;;
2)
systemInfo
;;
3)
yumadd
;;
4)
diskadd
;;
5)
jiance
;;
6)
shopt -s expand_aliases
#shopt expand_aliases
biem
source /etc/bashrc
;;
7)
changeName
;;
8)
sshSet
;;
9)
echo "退出選單"
break
;;
*)
echo "選擇錯誤,請重新選擇(1-9):"
esac
done



總結:
shell是一門腳本語言,像Java,Python一樣,要知道基本機構和語法,函式的使用等,最重要的是多敲,不然光靠看是需要漫長的歲月的,多敲命令,多大代碼才是王道!

轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/339220.html
標籤:其他
下一篇:可編程的SQL是什么樣的?
