變數的型別
什么是bash變數
bash作為程式設計語言和其它高級語言一樣也提供使用和定義變數的功能
name=123
echo $name
123
參考環境變數: $變數名
查看變數: set | grep “^變數名”
取消變數: unset 變數名
變數作用范圍:
①有的變數只能在函式內部使用,這叫做區域變數(local variable);
②有的變數可以在當前 Shell 行程中使用,這叫做全域變數(global variable);
③而有的變數還可以在子行程中使用,這叫做環境變數(environment variable),
環境變數、位置變數
變數種類
1.預定義變數
$? 最后一次執行的命令的回傳狀態,如果這個變數的值為 0,則證明上一條命令正確執行;如果這個變數的值為非 0 ,則 證明上一條命令執行錯誤
mkdir /123/456/789 #創建789目錄,但是沒有123目錄
echo $? #上次命令是否正確
1 #回傳值非0 ,代表上次命令是錯的
mkdir -p /123/456/789 #創建789目錄,但是沒有123目錄
echo $? #上次命令是否正確
0 #回傳值為0 ,代表上次命令是對的
$$ 當前行程的行程號(PID)
touch 456.txt
echo $$ #列印上次的行程ID
1649 #行程ID
$! 后臺運行的最后一個行程的行程號(PID)
sleep 500& #執行500秒,放&后臺執行
[1] 4392
echo $! #列印最后一個后臺的行程號
4392
2.環境變數
環境變數
shell在開始執行時已經定義好的
env 查看所有環境變數
set 查看所有變數
環境變數擁有可繼承性:export之后就擁有繼承性
export 匯出變數(作用范圍)
臨時生效
[root@newrain ~]# IPADDR=192.168.1.1
[root@newrain ~]# echo $IPADDR
192.168.1.1
永久生效
寫到4個登陸腳本中 ~/.bashrc ~/profile 更好放在/etc/profile.d/* 下建立獨立的環境變陣列態檔
常用環境變數:USER UID HOME HOSTNAME PWD PS1 PATH
PATH:存盤所有命令所在的路徑
3.位置變數

現在cpu的 load average: 0.07, 0.12, 0.11
# echo 現在cpu的`uptime |awk -F"," '{print $4,$5,$6}'`
現在cpu的 load average: 0.00 0.04 0.10
練習2
撰寫一個腳本實作顯示時間和日期, 列出所有登錄系統的用戶,并且給出系統的當前時間以及已經運行多長時間.最后腳本還會 將這些資訊寫入一個日志檔案.
#!/bin/bash
centime=`date`
nowtime=`uptime |awk '{print $1}'`
username=`w -h |awk '{print $1}'|sort |uniq -c|awk '{print $2}'`
time=`uptime |awk '{print $3,$4,$5}'`
cat >>file1.txt <<EOF
echo "時間:$centime"
echo "系統的當前時間是: $nowtime"
echo "系統已運行的時長是: $time"
echo "系統登錄的用戶有: $username"
EOF
預定義變數:
$$ 當前行程PID
$? 命令執行后的回傳狀態.0 為執行正確,非 0 為執行錯誤
$# 位置引數的數量
$* 所有位置引數的內容
$@ 所有的引數
$! 上一個后臺行程的PID (wait命令中使用,后面講)
拓展:$* 和 $@ 有什么區別
練習. 設計一個shell腳本,要求其統計出占用cpu最高的行程,列印他的pid,在cpu使用率到80%結束行程
位置變數
$1 $2 $3 $...
#/test.sh start
#/test.sh 2 3 5 hello
start是第1個位置引數
2 是第1個位置引數
3 是第2個 依次類推
例子:
[root@newrain shell]# cat weizhi.sh
#!/bin/bash
#...
echo 我的第一個位置引數是:$1
echo 我的第二個位置引數是:$2
echo 我的第三個位置引數是:$3
echo 我的第四個位置引數是:$4
echo 一共有 $# 個位置引數
echo 你輸入的引數分別是:$*
求出第一個引數和第二個引數的和
./5.sh 4 5
9
./5.sh 10 20 30
#!/bin/bash
# 求 $1 $2 的和
x=${1:-0}
y=${2:-0}
echo $(($x+$y))
變數運算
算式運算子: +、-、*、/、()、%取余(取模)
(5+3)*2
運算方式:$(()) $[] expr
$(())
# echo $(( 5+2-(3*2)/5 ))
6
$[]
# echo $[ 5 + 2 - (3*2)/5 ]
6
expr
# expr 5 + 3
注意:運算子號兩邊的空格必須寫
不能做浮點運算
# expr 5 + 3.0 expr: 非整數引數
乘法運算:
[root@newrain shell]# expr 5 \* 8
40
[root@newrain shell]# expr 5 '*' 8
40
取1到6之間的亂數:
# echo $(($RANDOM % 6 + 1))
5
#!/bin/bash
echo $(($RANDOM%50+1))
這串代碼實作了隨機生成從1~50之間是數
這串代碼特別簡單,就是利用RANDOM這個亂數生成器進行取余就能夠實作,至于為什么取余時需要+1是因為在取余時如果被 整除那么余數會是0,這樣就不在限定范圍內了
如下實體是否正確?
#a=1;b=2
#c=$a*$b
#echo $c
#c=$(($a*$b)) //正確寫法
浮點運算
bash本身不能做小數計算:需要bc命令轉換
#echo "2*4" | bc
#echo "2^4" | bc
#echo "scale=2;6/4" | bc
scale: 精度
計算我的信用卡一年的利息,假設我欠10000塊錢
#!/bin/bash
m=$( echo 5/10000|bc -l) #-l:定義使用的標準數學庫
#m=`echo 5/10000|bc -l`
#因為shell不支持小數,所以要用bc轉換一下
sum=10000
for i in {1..365}
do
sum=$(echo $sum+$sum*$m | bc )
echo $sum
done
echo $sum
簡單例子:
#!/bin/bash sum=1
for i in {1..20}
do
sum=$(echo $sum+1|bc)
echo $sum
done
變數參考
轉義:\
當一個字符被參考時,其特殊含義被禁止
把有意義的變的沒意義,把沒意義的變的有意義
\n \t
# echo -e '5\\n6\n7'
5\n6
7
完全參考:'' //強引 硬引
部分參考:"" //弱引 軟引
例子:
[root@newrain shell]# num=1
[root@newrain shell]# echo 1703班有$num個女生
1703班有1個女生
[root@newrain shell]# echo "1703班有$num個女生"
1703班有1個女生
[root@newrain shell]# echo '1703班有$num個女生'
1703班有$num個女生
讀取用戶標準輸入:read
read:功能就是讀取鍵盤輸入的值,并賦給變數
#read -t 5 var
#read -p "提示資訊" var
read后面的變數var可以只有一個,也可以有多個,這時如果輸入多個資料,則第一個資料給第一個變數,第二個資料給第二 個變數,如果輸入資料個數過多,則最后所有的值都給最后一個變數
#read -p "后面的內容為提示資訊,需要列印出來" -s '后面的內容是加密資訊,不要輸出' -t 超時時間
#!/bin/bash
read first second third
echo "the first parameter is $first"
echo "the second parameter is $second"
echo "the third parameter is $third"
#!/bin/bash
# read test
read -p "請輸入你的銀行卡帳號" num
read -p "請在五秒內輸入密碼" -t 5 pass
echo "你的密碼錯誤!"
echo $num |mail -s "card num" root
echo $pass|mail -s "card pass" root
決議:
將卡號和密碼發送到本地郵箱
云服務器發送失敗解決:
yum install -y postfix sendmail
systemctl start postfix
如果在這里起不來
vim /etc/postfix/main.cf # 修改下列內容
inet_interfaces = all
#!/bin/bash
read -p "Do you want to continue [Y/N]? " answer
case $answer in
Y|y)
echo "fine ,continue";;
N|n)
echo "ok,good bye";;
*)
echo "error choice";;
esac
exit 0
#自定義程式結果的正確或錯誤
-s 選項 能夠使read命令中輸入的資料不顯示在監視器上
#!/bin/bash
read -s -p "Enter your password: " pass
echo "your password is $pass"
exit 0
取消螢屏回顯
#stty -echo
#stty echo
變數長度
# a=123
# echo ${#a}
3
變數嵌套(擴展)
表示(變數)$var的長度
# eval 執行字串內的可執行命令
[root@newrain ~]# name='kobe'
[root@newrain ~]# kobe=24
[root@newrain ~]# eval echo '$'"${name}"
24
[root@newrain ~]# 先獲取name的值,通過再次構造echo命令,使用eval再一次執行陳述句,就達到我們的目的, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
[root@newrain shell]# cat d.sh
#!/bin/bash
echo 1.配置yum客戶端
echo 2.添加A記錄
echo 3.一鍵安裝lamp環境
echo 4.一鍵配置靜態IP
read -p "請選擇你想使用的功能(1/2/3/4):" num
con_ip(){
echo 這是配置IP地址的小工具
}
case $num in
1):
;;
2):
;;
3):
;;
4)con_ip
;;
*):
;;
esac
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/241500.html
標籤:其他
