補充
- $#——取參數個數
- “$n”,有值取值,無值取空字符,一般都會加引號,在某些情況下避免報語法錯誤
一、read接收鍵盤輸入
[root@localhost ~]# cat demo.sh
#!/bin/bash
echo -n "請輸入你的姓名:"
read nameecho "你的名字是:"$name
[root@localhost ~]# bash demo.sh
請輸入你的姓名:zhangsan
你的名字是:zhangsan
[root@localhost ~]#
語法:read [選項] [變量名]
- -p:提示信息,在read等待時輸入的信息
- -t:秒數,read等待的秒數
- -s:隱藏輸入信息
- -n:字符數,read最多能接收的字符數(達標即執行)
實驗一:測試各選項的用法
#!/bin/bash
#-p:提示信息
read -p "請輸入你的姓名:" name
#-s:隱藏年齡
read -p "請輸入你的年齡:" -s age
#-t:輸入時間只有10秒
read -p "請輸入你的性別:" -t 10 sex
#-n:電話號碼最多只能輸十一位
read -p "請輸入你的電話號碼:" -n 11 numberecho "輸入你的信息:"$name $age $sex $number
實驗二:可以同時接收多個參數,分別放在多個變量里
[root@localhost ~]# cat test2.sh
#!/bin/bash
read -p "請輸入你的姓名、性別、年齡、電話號碼:" name sex age number
echo "輸入你的信息:"$name $age $sex $number
[root@localhost ~]# bash test2.sh
請輸入你的姓名、性別、年齡、電話號碼:zhangsna man 32 123456789
輸入你的信息:zhangsna 32 man 123456789
[root@localhost ~]#
實驗三:嘗試修改接收參數個數,再看運行效果(某些特殊選項會出現不自動換行的bug,所以這里用echo來換行)
[root@localhost ~]# cat test2.sh
#!/bin/bash
echo "請輸入你的姓名、性別、年齡、電話號碼:"
read name sex age number
echo "輸入你的信息:"$name $age $sex $number
[root@localhost ~]# bash test2.sh
請輸入你的姓名、性別、年齡、電話號碼:
zhangsan man 32 123456 你好嗎?我是誰?
輸入你的信息:zhangsan 32 man 123456 你好嗎?我是誰?
[root@localhost ~]#
結論:
- 如果只提供了一個變量名,則整個輸入全部賦予該變量
- 如果提供了一個以上的變量名,則輸入行分為若干字,一個接一個地賦予各個變量,而命令行上的最后一個變量取得剩余的所有值
二、shell常用運算符
1.聲明指定類型的變量
注:數值運算需要使用declare聲明變量類型
類型分類
- 整數型
- 數組型
- 環境變量
- 只讀變量
實驗一:查看變量類型
[root@localhost ~]# name=lisi
[root@localhost ~]# declare -p name
declare -- name="lisi"
實驗二:整數型(shell中變量默認類型是字符串,兩個字符串相加的效果是字符拼接)
[root@localhost ~]# n1=10
[root@localhost ~]# n2=20
[root@localhost ~]# n=$n1+$n2
[root@localhost ~]# echo $n
10+20#整型
[root@localhost ~]# declare -i a=100 b=200
[root@localhost ~]# declare -i num=$a+$b
[root@localhost ~]# echo $num
300
注:變量類型——字符串(--)、數值(-i)、數組(-a)
2.命令:declare [+-][選項] [變量]
- -:給變量設置類型
- +:取消變量類型
- -i:將變量聲明成整數型
- -a:將變量聲明成數組型
- -x:將變量聲明成環境變量
- -r:將變量聲明成只讀
- -p:顯示指定變量的類型和內容
注:若使用echo輸出數值運算,則輸出結果只會是字符串拼接,不是數值運算的結果
#變量n是字符
[root@localhost ~]# declare -i n1=10
[root@localhost ~]# declare -i n2=20
[root@localhost ~]# n=$n1+$n2
[root@localhost ~]# echo $n
10+20
#變量n是整型
[root@localhost ~]# declare -i n
[root@localhost ~]# n=$n1+$n2
[root@localhost ~]# echo $n
30
#變量n是整型,n3和n4都是字符串
[root@localhost ~]# n3=10
[root@localhost ~]# n4=20
[root@localhost ~]# n=$n3+$n4
[root@localhost ~]# echo $n
30
即:
- 字符串=數值+數值——字符串的拼接
- 數值=數值+數值——數值的運算
- 數值=字符串+字符串——數值的運算
結論:變量名的類型要更加重要一些
三、數值的運算
方法一:定義一個數值類型的變量作為結果
#定義n為整型,計算n1+n2的值
[root@localhost ~]# declare -i n
[root@localhost ~]# n=$n1+$n2
[root@localhost ~]# echo $n
30
方法二:使用expr進行數值運算
[root@localhost ~]# x=100
[root@localhost ~]# y=200
[root@localhost ~]# expr $x + $y
300
[root@localhost ~]# expr $x * $y
expr: 語法錯誤:未預期的參數 “anaconda-ks.cfg”
[root@localhost ~]# expr $x \* $y
20000
[root@localhost ~]#
注:運算符左右兩端得有空格;乘號需要使用轉義符取消特殊含義
方法三:使用let進行數值計算
- 運算符左右不需要空格,但需要聲明一個新變量用于接收計算結果
- let還能進行自增減,或指定增加量或減少量
[root@localhost ~]# let he=$x+$y
[root@localhost ~]# echo $he
300
[root@localhost ~]# n=10
[root@localhost ~]# let n++
[root@localhost ~]# echo $n
11
[root@localhost ~]# let n=$n+1
[root@localhost ~]# echo $n
12
[root@localhost ~]# let n+=5
[root@localhost ~]# echo $n
17
[root@localhost ~]#
方法四:使用$(())或$[]進行數值運算
[root@localhost ~]# unset x;unset y
[root@localhost ~]# x=100
[root@localhost ~]# y=200
[root@localhost ~]# echo $(($x+$y))
300
[root@localhost ~]# echo $[$x+$y]
300
補充
#測試運算符的順序
[root@localhost ~]# echo $((16/5))
3
[root@localhost ~]# echo $((-16/5))
-3
[root@localhost ~]# echo $((-16/-5))
3
[root@localhost ~]# echo $((16/-5))
-3
#a%b,取余結果的符號和a一致
[root@localhost ~]# echo $((16%5))
1
[root@localhost ~]# echo $((-16%5))
-1
[root@localhost ~]# echo $((-16%-5))
-1
#對一個數n取余,余數是有范圍的,即[0-(n-1)]
------------
#指定范圍的隨機數,默認范圍是[0,32767]
$ echo $RANDOM
#在0~10之間產生一個隨機數
$ echo $(($RANDOM%11))
#在1~100之間產生一個隨機數
$ echo $(($RANDOM%100+1))
#表格中的優先級是乘除優先于加減,但是若加減被()調用,則括號內的優先級高于乘除
[root@localhost ~]# n1=$(((11+22)*33/44))
[root@localhost ~]# echo $n1
24
#邏輯與(一般單獨使用)
[root@localhost ~]# echo $((0&&0))
0
[root@localhost ~]# echo $((0&&1))
0
[root@localhost ~]# echo $((1&&0))
0
[root@localhost ~]# echo $((1&&1))
1
-----------
#shell中處理的數值都是整數類型,若處理小數用bc
5、Shell的環境變量配置
5-1、登錄環境變量的配置文件
[root@localhost ~]# yum -y install bc
[root@localhost ~]# echo "2.5+3.5"|bc
6.0
[root@localhost ~]# echo "2.3*3"|bc
6.9
注:$變量名取值;$(命令)取命令的值;$(())取運算表達式的值
四、數組
定義:名=(值1 值2 值3....)
[root@localhost ~]# name=(zhangsan lisi wangwu)
[root@localhost ~]# echo $name #默認情況下只能取第一個值
zhangsan
[root@localhost ~]# echo ${name[1]} #根據下標取值
lisi
--------------
#隨機取數值name中的值
[root@localhost ~]# echo ${name[$RANDOM%3]}
zhangsan
或
[root@localhost ~]# echo ${name[$(($RANDOM%3))]}
zhangsan
--------------
[root@localhost ~]# echo ${name[*]}
zhangsan lisi wangwu
[root@localhost ~]# echo ${name[@]}
zhangsan lisi wangwu
--------------
[root@localhost ~]# echo ${#name[@]} #取 值的個數,即數組的長度
3
[root@localhost ~]# echo ${#name[0]} #取的是一個值的字符串長度
8
[root@localhost ~]#
---------------
改:
[root@localhost ~]# name[1]=lisiis
[root@localhost ~]# echo ${name[@]}
zhangsan lisiis wangwu
增:
[root@localhost ~]# name[3]=laoliu
[root@localhost ~]# echo ${name[@]}
zhangsan lisiis wangwu laoliu
刪:
[root@localhost ~]# unset name[3]
[root@localhost ~]# echo ${name[@]}
zhangsan lisiis wangwu
[root@localhost ~]# unset name
[root@localhost ~]# echo ${name[@]}[root@localhost ~]#
五、知識點補充
字符串判斷
測試選項 | 作用 |
-z 字符串 | 判斷字符串是否為空(為空返回真) |
-n 字符串 | 判斷字符串是否為非空(非空返回真) |
字符串1 == 字符串2 | 判斷字符串是否相等(相等返回真) |
字符串1 != 字符串2 | 判斷字符串是否不相等(不相等返回真) |
練習1:寫一個腳本,計算1到100的值
[root@localhost ~]# cat he.sh
#!/bin/bash
n=0
for i in {1..100}
don=`expr $n + $i`
done
echo $nn1=0
for i in {1..100}
dolet n1+=$i
done
echo $n1n2=0
for i in {1..100}
don2=$((n2+=$i))
done
echo $n2
[root@localhost ~]# bash he.sh
5050
5050
5050
[root@localhost ~]#
練習2:寫一個腳本,給腳本傳輸一個值,計算從1到這個值的和
[root@localhost ~]# cat demo1.sh
#!/bin/bashecho -n "input start number:" $1
echo -n "input end number:" $2
let n=$2-$1+1
echo "count:"$(($n*($1+$2)/2))
[root@localhost ~]# bash demo1.sh 1 5
input start number: 1input end number: 5count:15
[root@localhost ~]#