目錄
- 什么是shell
- 一:shell回圈陳述句
- 1.1:for回圈
- 1.2:echo用法
- 1.3:姓名串列批量創建賬戶
- shell中let命令
- 二:while回圈陳述句
- 1.21:使用while回圈1-10數字
- 1.22:whlie死回圈
- 1.23:使用whlie批量添加用戶
- 1.24:10以內所有自然數的平方值 如1*1
- 三:continue和break區別
- 四:until回圈陳述句
- 1.41:計算1-20的和
- 1.42:until陳述句應用
什么是shell
Shell是一個命令列解釋器,它為用戶提供了一個向Linux內核發送請求以便運行程式的界面系統級程式,用戶可以用Shell來啟動、掛起、停止甚至時撰寫一些程式,Shell還是一個功能相當強大的編程語言,易撰寫,易除錯,靈活性較強,Shell是解釋執行的腳本語言,在Shell中可以直接呼叫Linux系統命令
一:shell回圈陳述句
1.1:for回圈
for回圈的運作方式,是講串行的元素意義取出,依序放入指定的變數中,然后重復執行含括的命令區域(在do和done 之間),直到所有元素取盡為止,
其中,串行是一些字串的組合,彼此用$IFS所定義的分隔符(如空格符)隔開,這些字串稱為欄位,

for #條件
do
#執行命令
done #結束
行1,講串行中的欄位迭代放入變數中
行2-4,接著將重復執行do和done之間的命令區域,直到串行中每一個欄位軍處理過為止,
#!/bin/bash
for ((a=10;a>0;a--))
do
echo -n " TIME $a"
echo -ne "\r " #不換行覆寫輸出
sleep 1
done

1.2:echo用法
echo [-ne][字串]或 echo [--help][--version]
補充說明:echo會將輸入的字串送往標準輸出,輸出的字串間以空白字符隔開, 并在最后加上換行號,
參 數: -n 不要在最后自動換行
-e 若字串中出現以下字符,則特別加以處理,而不會將它當成一般
文字輸出:
\a 發出警告聲;
\b 洗掉前一個字符;
\c 最后不加上換行符號;
\f 換行但游標仍舊停留在原來的位置;
\n 換行且游標移至行首;
\r 游標移至行首,但不換行;
\t 插入tab;
\v 與\f相同;
\\ 插入\字符;
\nnn 插入nnn(八進制)所代表的ASCII字符;
--help 顯示幫助
--version 顯示版本資訊
范例 : [root@localhost ~]# echo "what is your name "
1.3:姓名串列批量創建賬戶
[root@server1 ~]# vi 1.txt
tom
jerry
wendy
[root@server1 ~]# vim 1.sh
#!/bin/bash
a=$(cat /root/1.txt)
for b in $a
do
useradd $b
echo "654321" | passwd --stdin $b
echo "創建{$b}完成"
done
[root@server1 ~]# sh 1.sh
更改用戶 tom 的密碼 ,
passwd:所有的身份驗證令牌已經成功更新,
創建{tom}完成
更改用戶 jerry 的密碼 ,
passwd:所有的身份驗證令牌已經成功更新,
創建{jerry}完成
更改用戶 wendy 的密碼 ,
passwd:所有的身份驗證令牌已經成功更新,
創建{wendy}完成
語法2:
for ((初始化;;回圈控制條件;變數變化))
do
程式
done
需要注意以下幾點:
-
初始值:在回圈開始時,需要給某個變數賦予初始值,如 i=1,
-
回圈控制條件:用于指定變數回圈的次數,i<=100,則只要 i 的值小于等于 100,回圈就會繼續,
-
變數變化:每次回圈之后,變數該如何變化,如 i=i+1,代表每次回圈之后,變數的值都加 1,
-
語法二和其他語言中的 for 回圈類似,也就是事先決定回圈次數的固定回圈,先舉一個簡單的例子,
+、-、*、/ -
(++) 自身變數+1
-
(- -)自身變數-1
-
(+=5) 自身變數
-
(-=)5 自身變數-5
-
( * )5自身變數*5
lt 可以單獨使用 % 自身變數 %5
+=5 自身變數 +5自身變數 %5
-=5 自身變數-5 * 5自身變數*5
/= 自身變數/5
##continue和break區別)# 1.14:100以內不能整除3的數
[root@server1 ~]# vim c.sh
#!/bin/bash
i=100
while [ $i -gt 0 ]
do
if [ `expr $i % 3` -eq 0 ];then
let i--
continue
else
echo -n " $i"
fi
let i--
done
[root@server1 ~]# sh c.sh
100 98 97 95 94 92 91 89 88 86 ……
shell中let命令
let 對整數進行數學運算
let和雙小括號 (( )) 一樣,let 命令也只能進行整數運算,不能對小數(浮點數)或者字串進行運算,
語法格式
let 運算式
或
let "運算式"
或
let '運算式'
以上方式都等價于 ((運算式))
- 當運算式中含有 Shell 特殊字符(例如 |)時,需要用雙引號" "或者單引號’ '將運算式包圍起來,
- 和 (( )) 類似,let 命令也支持一次性計算多個運算式,并且以最后一個運算式的值作為整個 let 命令的執行結果,
二:while回圈陳述句
while 回圈主要用于無限次的回圈情況,例如登錄認證,你不知道多少次可以登錄成功,當然可以認為限制登錄次數,

1.21:使用while回圈1-10數字
#!/bin/bash
i=0
while [ $i -le 10 ]
do
echo $i
let i++
done
[root@server1 ~]# sh d.sh
0
1
2
3
4
5
6
7
8
9
10
1.22:whlie死回圈
while true:死回圈有時候也有奇效,可與用戶互動
#!/bin/bash
while true
do
read -p '輸入tom才可退出:' a
if [ $a = tom ]
then
break
fi
done
echo '退出'
[root@server1 ~]# sh f.sh
輸入tom才可退出:a
輸入tom才可退出:tom
退出
[root@server1 ~]#
1.23:使用whlie批量添加用戶
用戶名稱以shuai開頭,按照順序進行排序
一共添加了5個賬戶,即hua1…hua5
#!/bin/bash
a=0
while [ $a -le 5 ]
do
let a++
useradd tom$a
echo "123123" | passwd --stdin tom$a &> /dev/null
echo "tom$添加完畢"
done
echo "結束"
[root@server1 ~]# sh g.sh
tom$添加完畢
tom$添加完畢
tom$添加完畢
tom$添加完畢
tom$添加完畢
tom$添加完畢
結束
1.24:10以內所有自然數的平方值 如1*1
#!/bin/bash
num=1
while [ $num -lt 10 ]
do
a=$(expr $num \* $num)
echo $a
let num++
done
[root@server1 ~]# sh 2.sh
1
4
9
16
25
36
49
64
81
猜商品價格游戲
通過變數RANDOM獲得亂數
提示用戶猜測并記錄次數,猜中后退出回圈
#!/bin/bash
#猜商品價格
RR=$(expr $RANDOM % 1000) #$RANDOM 生成1000以內的亂數
i=0
echo "猜價格游戲"
while true
do
read -p "請輸入商品價格(0-999):" num
let i++
if [ $num -eq $RR ];then
echo "恭喜猜中了"
echo "恭喜猜中了$i"
break
elif [ $num -gt $RR ];then
echo "猜高了"
else
echo "猜低了"
fi
done
[root@server1 ~]# sh 3.sh
猜價格游戲
請輸入商品價格(0-999):500
猜高了
請輸入商品價格(0-999):255
猜低了
請輸入商品價格(0-999):400
猜高了
請輸入商品價格(0-999):350
猜高了
請輸入商品價格(0-999):300
猜高了
請輸入商品價格(0-999):275
猜低了
請輸入商品價格(0-999):285
猜低了
請輸入商品價格(0-999):293
猜低了
請輸入商品價格(0-999):296
猜低了
請輸入商品價格(0-999):299
恭喜猜中了
一共猜了了10次
三:continue和break區別
break 命令可以帶一個引數,一個不帶引數的break 回圈只能退出最內層的回圈,而break N可以退出N 層回圈
continue 命令也可以帶一個引數,一個不帶引數的continue 命令只去掉本次回圈的剩余代碼,而continue N 將會把N 層回圈剩余的代碼都去掉,但是回圈的次數不變
#!/bin/sh
for i in a b c d
do
echo
echo -n "$i "
for j in `seq 10`
do
if [ $j == 5 ]; then
# break
# break 2
# continue
continue 2
fi
echo -n "$j "
done
echo
done
echo
break結果:
a 1 2 3 4
b 1 2 3 4
c 1 2 3 4
d 1 2 3 4
break 2的結果:
a 1 2 3 4
continue結果:
a 1 2 3 4 6 7 8 9 10
b 1 2 3 4 6 7 8 9 10
c 1 2 3 4 6 7 8 9 10
d 1 2 3 4 6 7 8 9 10
continue 2的結果:
a 1 2 3 4
b 1 2 3 4
c 1 2 3 4
d 1 2 3 4
# 四:untli回圈陳述句
!
四:until回圈陳述句

重復測驗某個條件,只要條件不成立則反復執行
until 條件測驗操作
do
命令序列
done
while 未超過20
do
數字依次增加
done:
行1,如果條件測驗結果為假(傳回值不為0),就進入回圈,
行3,執行命令區域,這些命令中,應該有改變條件測驗的命令,這樣子,才有機會在有限步驟后結束執行until 回圈(除非你想要執行無窮回圈),
行4,回到行1,執行until命令
1.41:計算1-20的和
通過回圈累計的方式計算1-20的和
until跟whlie相反是命令不成立就會進入回圈=whlie前面加!
#!/bin/bash
k=1
s=0
until [ $k -eq 11 ] #當取值為21就會成立就不會進入回圈'
do
let s+=$k
let k++
done
echo "和:$s"
[root@server1 ~]# sh b.sh
和:55
1.42:until陳述句應用
為指定用戶發送在線訊息
- 若指定用戶不在線(未登陸系統),則每10分鐘(實驗中為了測驗效果,可改為5s)試一次,直至用戶登錄系統后再發送資訊
- 用戶名與訊息通過為止引數傳遞給腳本
#!/bin/bash
username=$1
#判斷格式引數是否為空
if [ $# -lt 1 ]
then
echo "Usage:`basename $0` <username> [<message>]"
exit 1
fi
#判斷賬號是否存在
if grep "^$username:" /etc/passwd &> /dev/nell;then :
else
echo "用戶不存在"
exit 2
fi
#判斷用戶是否在線
until who | grep "$username" &> /dev/null
do
echo "用戶不在線,正在嘗試連接"
sleep 5
done
------------------------------------------------
`basename $0`值顯示當前腳本或命令的名字
Message:定義發送內容
oot@localhost opt]# bash test.sh
Usage:test.sh <username> [<message>]
#測驗不存在用戶
[root@localhost opt]# sh test.sh sushan
用戶不存在
#用戶不在線時
[root@localhost opt]# ./mes.sh sushan
用戶不在線,正在嘗試連接
用戶不在線,正在嘗試連接
用戶不在線,正在嘗試連接
準備了好多天肝了出來
如果覺得對您有用的話,點個贊再走吧!!!
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/141583.html
標籤:其他
上一篇:LAMP架構——編譯安裝Apache,每個步驟都有詳細解釋
下一篇:python的練習
