概述:本篇重點介紹linux當中默認設立了類型,bash的邏輯運算、測試類型和腳本語句,本篇內容極其重要,望小伙伴們在日后的學習中用心學習
一、邏輯運算
變量:
本地變量、環境變量、局部變量、位置參數變量、特殊變量
變量賦值:name=value,export name=value,declare -x name=value
變量引用:$name,${name}
注意:有些時候{}不能省略,例如
echo "$valuemagedu.com"
echo "${value}magedu.com"
撤銷:unset name
bash腳本編程,運行腳本
#!/bin/bash #稱為shebang是bash腳本的默認開頭行固定格式
# # #號后面是注釋信息,不顯示也不影響腳本執行結果
空白行 忽略不顯示行
bash的配置文件
porfile類:登錄式shell
bashrc類:非登錄式shell
登錄式shell:/etc/profile–>/etc/profile.d/*.sh–>~/.bash_profile–>~/.bashrc–>/etc/bashrc
非登錄式shell:~/.bashrc–>/etc/bashrc–>/etc/profile.d/*.sh
算數運算
+,-,*,/,**(乘次方),%(求模取余)
在bash中默認數據類型都是字符串形式,做算數運行需要經特殊方法才可以
示例:
[root@localhost ~]# num1=2 [root@localhost ~]# num2=9 [root@localhost ~]# echo "${num1}+${num2}" 2+9 [root@localhost ~]# declare -i num3=5 [root@localhost ~]# declare -i num4=9 [root@localhost ~]# echo "${num3}+${num4}" 5+9
算術運算格式:
(1)let VAR=算數運算表達式
[root@localhost ~]# let ${num1}+${num2}
#默認不輸出結果到屏幕,所以需要賦值給變量,再引用
[root@localhost ~]# let sum5=${num1}+${num2} [root@localhost ~]# echo ${sum5} 11
let 參數 [參數 …]
算術運算格式含義
num++,num– (兩個減號不是大橫線)變量后遞增,后遞減
++num,–num(兩個減號不是大橫線)變量前遞增,前遞減
+,-加法、 減法
!,~ 邏輯和按位求反
** 求冪運算(乘次方)
*,/,% 乘法,除法,求模(求余)
<<,>> 左和右移位
<=,>=,<,> 比較
==、 != 平等,不平等
& 按位與
^ 按位異或
| 按位或
&& 邏輯與
|| 邏輯或
expr ?expr: expr
條件運算符
=, *=, /=, %=,+=, -=, <<=, >>=,&=,^=,|= 賦值
變量也可以作為let 命令的參數
(2)VAR=$[算數運算表達式]
但是不能直接運行,賦不賦值給變量都可以,需要命令直接引用,如echo
[root@localhost ~]# $[${num2}+${num3}] bash: 14: 未找到命令... [root@localhost ~]# echo "$[${num2}+${num3}]" 14
(3)VAR=$((算數運算表達式))
但是不能直接運行,賦不賦值給變量都可以,需要命令直接引用,如echo
[root@localhost ~]# $((${num2}+${num3})) bash: 14: 未找到命令... [root@localhost ~]# echo $((${num2}+${num3})) 14
(4)expr EXPRESSION 或 VAR=$(expr EXPRESSION)
expr OPTION
示例:
[root@localhost ~]# num1=2 [root@localhost ~]# num2=4 [root@localhost ~]# expr ${num1} + ${num2} 6 [root@localhost ~]# sum=$(expr ${num1} \* ${num2}) #注意乘法*符號需要轉意(原因是*號在有些場景中為glob通配符) [root@localhost ~]# echo "${sum}" 8
expr 參數的算術運算格式
ARG1 | ARG2
ARG1 是否為 null,也不是 0,否則為 ARG2
ARG1 & ARG2
ARG1 如果參數都不是 null 或 0,否則為 0
ARG1 < ARG2
ARG1 小于 ARG2
ARG1 <= ARG2
ARG1 小于或等于 ARG2
ARG1 = ARG2
ARG1 等于 ARG2
ARG1 != ARG2
ARG1 ARG2 不等于
ARG1 >= ARG2
ARG1 是大于或等于 ARG2
ARG1 > ARG2
ARG1 大于 ARG2
ARG1 + ARG2
ARG1 和 ARG2 的算術總和
ARG1 -ARG2
ARG1 減 ARG2 的算術差
ARG1 * ARG2
ARG1 和 ARG2 的算術積
ARG1 / ARG2
ARG1 除以 ARG2 的算術商
ARG1 % ARG2
ARG1 除以 ARG2 的算術余數
注意:算數運算格式內各參數彼此之間必須有空格,并且shell腳本不支持浮點型
增強型賦值:
變量做某種算數運算后回存至此變量中;
eg:
let i=$i+#
let i+=#
還有:+=,-=,*=,/=,%=
自增:
VAR=$[$VAR+1]
let VAR+=1
let VAR++
自減:
VAR=$[$VAR-1]
let VAR-=1
let VAR–
二、條件測試:
判斷某需求是否滿足,需要由測試機制來實現;
如何編寫測試表達式以實現所需的測試;
(1)執行命令,并利用命令狀態返回值來判斷
0:成功
1-255:失敗
(2)測試表達式
test EXPRESSION eg:test 3 -gt 2
[ EXPRESSION ]
[[ EXPRESSION ]]
注意:EXPRESSION兩端必須有空白字符,否則有語法錯誤
bash的測試類型:
數值測試:數值比較
-eq:是否等于; eg:[ $num1 -eq $sum2 ]
-ne:是否不等于
-gt:是否大于
-ge:是否大于等于
-lt:是否小于
-le:是否小于等于
字符串測試:
==:是否等于;(字符串)
一個=號也可以由于賦值變量用=號,但是賦值并不應用到[]中,所以能夠使用,但是還是推薦使用雙=號
>:是否大于
<:是否小于
!=:是否不等于
=~:左側字符串時候能夠被右側的PATTERN所匹配;(模糊匹配而非精確匹配)
示例:
[root@localhost ~]# [[ tom =~ tom ]] [root@localhost ~]# echo $? 0 [root@localhost ~]# [[ tom =~ om ]] [root@localhost ~]# echo $? 0 [root@localhost ~]# [[ tom =~ o ]] [root@localhost ~]# echo $? 0 [root@localhost ~]# [[ tom =~ x ]] [root@localhost ~]# echo $? 1
-z "STRING":判斷指定的字符串是否為空,空為真,不空為假
-n "STRING":判斷指定的字符串是否為不空,不空為真,空為假
注意:(1)字符串測試時:字符串要加引號,表示引用有變量命令"",沒有變量命令使用''
(2)作比較時,盡量使用[[]];
(3) 但是在組合測試時,[[]]有時會有語法錯誤,所以可以使用[]
示例:
[root@localhost ~]# [ var1 == var1 ] [root@localhost ~]# echo $? 0 [root@localhost ~]# [ var1 == Var1 ] [root@localhost ~]# echo $? 1 [root@localhost ~]# [ var1 == ${Var2} ] -bash: [: var1: 期待一元表達式 [root@localhost ~]# [ var1 == "${Var2}" ] [root@localhost ~]# echo $? 1 [root@localhost ~]# [ a > b] -bash: [: 缺少 `]' [root@localhost ~]# [ a > b ] [root@localhost ~]# echo $? 0 [root@localhost ~]# [ a < b ] [root@localhost ~]# echo $? 0 [root@localhost ~]# [ "a" < "b" ] [root@localhost ~]# echo $? 0 [root@localhost ~]# [ "a" > "b" ] [root@localhost ~]# echo $? 0 [root@localhost ~]# [[ "a" > "b" ]] [root@localhost ~]# echo $? 1
文件測試:
存在性測試:
-a FILE 少使用
-e FILE 推薦使用
文件存在則為真,否則為假
存在性及類型測試:
-b FILE:是否存在并且為塊設備文件;
-c FILE:是否存在并且為字符設備文件;
-d FILE:是否存在并且為目錄文件;
-f FILE:是否存在并且為普通文件;
-h FILE 或 -L FILE:是否存在并且為符號鏈接文件;
-p FILE:是否存在并且為管道文件;
-S FILE:是否存在并且為套接字文件;
文件權限測試:
-r FILE:是否存在并且對當前用戶可讀;
-w FILE:是否存在并且對當前用戶可寫;
-x FILE:是否存在并且對當前用戶可執行;
特殊權限測試:
-u FILE:是否存在并且擁有suid權限;
-g FILE:是否存在并且擁有sgid權限;
-k FILE:是否存在并且擁有sticky權限;
注意:對于腳本則是當前運行此腳本的用戶
文件是否有內容:
-s FILE:是否有內容;
時間戳測試:
-N FILE:文件自從上一次讀取操作后是否被修改過
從屬關系測試:
-O FILE:當前用戶是否為文件的屬主;
-G FILE:當前用戶是否屬于文件的屬組;
雙目測試:
FILE 1 -ef FILE2 :FILE1與FILE2是否指向同一個文件系統的相同inode的硬鏈接;
FILE 1 -nt FILE2 :FILE1的最近一次更新時間是否新于FILE2的最近一次更新時間
FILE 1 -ot FILE2 :FILE1的最近一次更新時間是否舊于FILE2的最近一次更新時間
組合測試條件:
邏輯運算:
第一種方式:
COMMAND1 && COMMAND2
COMMAND1 || COMMAND2
! COMMAND
eg: [ -O FILE ] && [ -r FILE ]
第二種方式:
test EXPRESSION1 -a EXPRESSION2
[ EXPRESSION1 -a EXPRESSION2 ]
[[ EXPRESSION1 -a EXPRESSION2 ]]
類此還有
EXPRESSION1 -o EXPRESSION2
! EXPRESSION
eg:[ -O FILE -a -r FILE ]
注意:模式匹配時,勢必要激活正則表達式引擎,而使用正則表達式的測試判斷,要比單一字符串測試判斷要慢,所以盡量避免使用正則表達式進行查找比較和測試;
腳本的狀態返回值:
默認是腳本中執行的最后一條件命令的狀態返回值
自定義狀態退出狀態碼:exit [n]:n為自己指定的狀態碼;
注意:shell進程遇到exit時,即會終止,因此,整個腳本執行即為結束;
三、bash腳本語句
過程式編程語言的代碼執行順序:
順序執行:從左至右,從上至下,逐一運行
選擇執行:代碼有一個分支:條件滿足時才會執行
兩個或以上的分支:只會執行其中一個滿足條件的分支
循環執行:
代碼片段(循環體)要執行0、1或多次重復運行
選擇執行:
單分支的if語句
if 測試條件;then
代碼分支
條件為真則執行,為假則不執行
或者
fi
if 測試條件
then
代碼分支
條件為真則執行,為假則不執行 fi
雙分支的if語句:
if 測試條件;then
條件為真時執行的分支
else
條件為假時執行的分支
fi
多分支的if語句:
if COMDITION1;then
條件1為真分支
elif COMDITION2;then
條件2為真分支
elif COMDITION3;then
條件3為真分支
…
elif COMDITIONn;then
條件n為真分支
else
所有條件均不滿足時的分支
fi
注意:即便多個條件可能同時都能滿足,分支只會執行其中一個,首先測試為“真”;并且if語句可嵌套if等其他語句
case語句的語法格式:
case $VARAIBLE in
PATH1)
分支
;;
PATH2)
分支
;;
…
*)
分支
;;
esac
注意:雙分號如果不加,則會前一個匹配執行后,下一個會接著匹配執行
適用于一個變量,與多個可能取值比較
支持glob風格的通配符:
*:任意長度的任意字符;
?:任意單個字符
[]:范圍內任意個字符
a|b:a或b;
bash腳本編程之用戶交互:
腳本參數
用戶交互:通過鍵盤輸入數據,從而完成變量賦值操作
read [option]…[name…]
-p 'PROMPT' 提示注釋信息
-t TIMEOUT 時間限制
bash -n /path/to/some_script
檢測腳本中的語法錯誤
bash -x /path/to/some_script
調試執行
循環執行:將一段代碼重復執行0、1或多次;
進入條件:條件滿足時才進入循環
退出條件:每一個循環都應該有退出條件,以有機會退出循環
bash腳本:
for循環
while循環
until循環
for循環:
執行機制:依次將列表中的元素賦值給“變量名” ; 每次賦值后即執行一次循環體; 直到列表中的元素耗盡,循環結束
兩種格式:
(1)遍歷列表
(2)控制變量
遍歷列表
for VARAIBLE in LIST;do
循環體
done
進入條件:LIST列表有元素,即可進入循環
退出條件:列表中的元素遍歷完成
LIST的生成方式:
(1)直接給出;
(2)整數列表
(a){start…end}
(b)seq [start [incremtal]] last
(3)返回列表的命令:$(COMMAND),例如:ls cat
(4)glob通配符
(5)變量引用;例如$@,$*
格式示例:
#!/bin/bash
#
for username in user1 user2 user3;do
if id $username &>/dev/null;then
echo "$username exists."
else
useradd $username && echo "Add user $username finished."
fi
done
示例:求100以內的正整數之和
#!/bin/bash
#
delcare -i sum=0
for i in {1..100};do
echo "\$sum is $sum,\$i is $i"
sum=$[$sum+$i]
done
echo $sum
示例:判斷/var/logm目錄下的每一個文件的內容類型
#!/bin/bash
#
for filename in /var/log/*;do
if [ -f $filename ];then
echo "Common file."
elif [ -L $filename ];then
echo "Sysbolic link"
elif [ -d $filename ];then
echo "Directory."
elif [ -b $filename ];then
echo "block special file."
elif [ -c $filename ];then
echo "character special file."
elif [ -S $filename ];then
echo "Socket file."
else
echo "Unkown."
fi
done
while循環:
while CONDITION;do
循環體
循環控制變量修正表達式
done
CONDITION:循環控制條件;進入循環之前,先做一次判斷;每一次循環之后會再次做判斷;條件為“true”,則執行一次循環;直到條件測試狀態為“false”終止循環,因此:CONDTION一般應該有循環控制變量;而此變量的值會在循環體不斷地被修正
進入條件:CONDITION測試為“真”
退出條件:CONDITION測試為“假”
示例:求100以內的正整數之和
#!/bin/bash
#
declare -i sum=0
declare -i i=1
while [ $i -le 100 ];do
sum=$[$sum+$i]
let i++
done
echo $sum
1、編寫腳本/root/bin/createuser.sh,實現如下功能:使用一個用戶名做為參數,如果指定參數的用戶存在,就顯示其存在,否則添加之;顯示添加的用戶的id號等信息
#!/bin/bash #寫一個腳本/root/bin/createuser.sh,實現如下功能:使用一個用戶名做為參數,如果指定參數的用戶存 在,就顯示其存在,否則添加之;顯示添加的用戶的id 號等信息 [[ -z $1 ]] && echo "請輸入一段字符串作為用戶名"&& exit if grep -E "^$1:" /etc/passwd &>/dev/null;then echo "s1:已經存在此用戶" exit else useradd $1 id $1 echo "用戶已經幫您添加" exit fi
2、編寫腳本/root/bin/yesorno.sh,提示用戶輸入yes或no,并判斷用戶輸入的是yes還是no,或是其它信息
#!/bin/bash #提示用戶輸入yes或no, 并判斷用戶輸入的是yes 還是no,或是其它信息 [[ -z $1 ]] && echo "請輸入一段字符串" && exit var=`echo "$1" | tr "[[:lower:]]" "[[:upper:]]"` if [[ ${var} =~ "YES" ]];then echo "用戶輸入的是$1" elif [[ ${var} =~ "NO" ]];then echo "用戶輸入的是$1" else echo "用戶輸入的是其它信息" fi unset var
3、編寫腳本/root/bin/filetype.sh,判斷用戶輸入文件路徑,顯示其文件類型(普通,目錄,鏈接,其它文件類型)
#!/bin/bash if [[ $# -lt 1 ]] then echo -e "Error: No argument.\n\tUsage: $0 FILENAME" exit 1 else if [[ ! -e $1 ]] then echo "$1: No such file or diretory" elif [[ -d $1 ]] then echo "$1 is a diretory" elif [[ -L $1 ]] then echo "$1 is a link file" elif [[ -f $1 ]] then echo "$1 is a common file" fi fi
4、編寫腳本/root/bin/checkint.sh,判斷用戶輸入的參數是否為正整數
#!/bin/bash read -p "請入一個數字:" num [ -z "$num" ]&&echo "請輸入一個數字"&&exit 1 NUM=$(echo $num |grep -Eo "\-?[[:digit:]]+") if [ "$NUM" == "$num" ];then if [ "$NUM" -lt "0" ];then echo "您輸入的是一個負整數!" elif [ "$NUM" -eq "0" ];then echo "您輸入的是一個0!" else echo "恭喜,您輸入的是一個正整數!" fi else echo "您輸入的不是一個整數,請重新運行腳本!" fi
練習:用for實現
1、判斷/var/目錄下所有文件的類型
#!/bin/bash cd $1 &> /dev/null # diretory judge if [[ $? = 0 ]] then for i in `ls -A $1` do FileType=`ls -dl $DirName/$i | cut -c1` case $FileType in d) echo "$i is a diretory." ;; -) echo "$i is a common file." ;; l) echo "$i is a link file." ;; b) echo "$i is a block file." ;; c) echo "$i is a character file." ;; p) echo "$i is a pipe file." ;; s) echo "$i is a socket file." ;; *) echo "$i is other file" ;; esac done else echo "$1 is not a diretory" exit 2 fi unset DirName unset FileType
2、 添加10個用戶user1-user10,密碼同用戶名
#/bin/bash if [[ $# -lt 1 ]] then echo -e "Error: No option \n\t-d\tdelete user1-user10\n\t-a\tadd user1-user10 " exit 1 fi for i in $(seq 10);do case $1 in -d|--del) if id user$i &> /dev/null;then userdel -r user$i echo "user$i: Delete complete!" else echo "user$i: No such user!" fi ;; -a|--add) if id user$i &> /dev/null;then echo "user$i"| passwd --stdin "user$i" &> /dev/null echo -e "user$i: Already existed!\nAnd authentication tokens updated successful!" else useradd user$i &> /dev/null echo "user$i"| passwd --stdin "user$i" &> /dev/null echo " user$i: Add complete!" fi ;; *) echo "Error:" echo -e "$0 : Unknow option!\nplease use '-a''--add' to add user or '-d''--dell'to delect user" exit 1 ;; esac done
3、 /etc/rc.d/rc3.d目錄下分別有多個以K開頭和以S開頭的文件;分別讀取每個文件,以K開頭的文件輸出為文件加stop,以S開頭的文件輸出為文件名加start;
“ K34filename stop”
“S66filename start”
#!/bin/bash for i in `ls /etc/rc.d/rc3.d` do FileC1=`echo $i | cut -c1` case $FileC1 in K) echo -e "$i\tstop" ;; S) echo -e "$i\tstart" ;; *) echo "unkown file" ;; esac done
4、編寫腳本,提示輸入正整數n的值,計算1+2+3+…n的總和
#!/bin/bash # delcare -i sum=0 for i in {1..$1};do echo "\$sum is $sum,\$i is $i" sum=$[$sum+$i] done echo $sum
5、編寫腳本,提示請輸入網絡地址,如192.168.0.0,判斷輸入的網段中主機在線狀態
#!/bin/bash # 寫一個腳本,提示請輸入網絡地址,如 192.168.0.0 ,判斷輸入的網段中主機在線狀態 # only for netmask 255.255.255.0 echo -n "Enter IP:" read IP #get IP segment Segment=`echo $IP | cut -d. -f1-3 `. # if echo $IP | egrep '\<([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.(([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.){2}([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\>' &>/dev/null then #test only 5 host for i in `seq 240 255` do if ping -c 1 -W 1 $Segment$i &> /dev/null then echo -e "$Segment$i\tonline" else echo -e "$Segment$i\toffline" fi done else echo "$IP is invalid" fi
6、 打印九九乘法表
#!/bin/bash # for i in {1..9};do for j in $(seq 1 $i);do echo -n -e "$j*$i=$[$j*$i]\t" done echo done
用while實現
1、 編寫腳本,求100以內所有正整數之和
#!/bin/bash # declare -i sum=0 declare -i i=1 while [ $i -le 100 ];do sum=$[$sum+$i] let i++ done echo $sum
2、 編寫腳本,通過ping命令探測172.16.250.1-254范圍內的所有主機的在線狀態,統計在線主機和離線主機各多少。
#!/bin/bash # a="10.1.252." i=0 j=0 k=0 while [ $i -le 255 ];do ping -c1 -W1 $a$i &> /dev/null if [ $? -eq 0 ];then echo "$a$i is active" let j++ else echo "$a$i is inactive" let k++ fi let i++ done echo "the sum number of active users is $j" echo "the sum number of inactive users is $k"
3、 編寫腳本,打印九九乘法表
#!/bin/bash #function: 9*9 tables #author: xiaoshui i=1 while [ $i -le 9 ];do j=1 while [ $j -le $i ];do mul=$[$i*$j] echo -ne "$i*$j=$mul\t" j=$[$j+1] done echo i=$[$i+1] done
4、 編寫腳本,利用變量RANDOM生成10個隨機數字,輸出這個10數字,并顯示其中的最大者和最小者
#!/bin/bash # i=10 a=$RANDOM max=$a min=$a while [ $i -ge 1 ] do [ $max -lt $a ] && max=$a [ $min -gt $a ] && min=$a echo "$a" a=$RANDOM let i-- done echo "最大值$max" echo "最小值$min"
5、編寫腳本,實現打印國際象棋棋盤
#!/bin/bash # # # i=1 while [ $i -le 8 ];do j=1 while [ $j -le 8 ];do sum=`expr $i + $j` z=`expr $sum % 2` [ $z -eq 0 ] && echo -ne "\033[41;1m \033[0m"||echo -ne "\033[43;1m \033[0m" let j++ done echo let i++ done
#!/bin/bash # declare -i i=1 declare -i j=1 while [ $i -lt 9 ];do if [ $[$i%2] -eq 0 ] ;then while [ $j -lt 9 ];do if [ $[$j%2] -ne 0 ];then echo -en "\e[43;37m \e[0m" else echo -en "\e[45;37m \e[0m" fi let j++ done else while [ $j -lt 9 ];do if [ $[$j%2] -eq 0 ];then echo -en "\e[43;37m \e[0m" else echo -en "\e[45;37m \e[0m" fi let j++ done fi declare -i j=1 let i++ echo "" done unset i;unset j
1、每隔3秒鐘到系統上獲取已經登錄的用戶的信息;如果發現用戶hacker登錄,則將登錄時間和主機記錄于日志/var/log/login.log中,并提示該用戶退出系統。
#!/bin/bash #function: check hacker login and hint logout until who |grep -q "^hacker\b" ;do sleep 3 done who | grep "^hacker"|tr -s ' '|cut -d' ' -f3,5 >> /var/log/login.log echo "you should logout system" | mail hacker echo "reminded and login record in /var/log/login.log"
2、隨機生成10以內的數字,實現猜字游戲,提示比較大或小,相等則退出。
#!/bin/bash suiji=$[$RANDOM%10+1] read -p "請輸入數字:" num until [[ $suiji -eq $num ]]; do [ $shuru -lt $suiji ] && echo "小了,往大了猜" [ $shuru -gt $suiji ] && echo "大了,往小了猜" read -p "請再次輸入數字:" num done echo "恭喜你猜中了?。?!"
1、寫個腳本:
* **** ******** ************
1 4
1,3空格1個*
2,2空格2個*
3,1空格,3*
n行空格數=總行數-n
n行*數=2n-1
#!/bin/bash # #打印三角形 #獲取終端寬度 termCols=`tput cols` #根據終端寬度,判斷出能夠正常打印三角形的行數; maxLineNum=`seq 1 2$termCols |wc -l` echo -e "#當終端的寬度最多能夠正常打印$maxLineNum行\n#請輸入要打印的三角形行數" read -p "#行數范圍大于1小于等于$maxLineNum,請輸入行數:" lineNeeds [[ `tput cols` -ne $termCols ]] && echo "終端寬度已經被改變,請重新運行腳本" &&exit 1 [[ $lineNeeds =~ ^[[:digit:]]+$ && $lineNeeds -ge 2 && $lineNeeds -le $maxLineNum ]] [[ $? -ne 0 ]] && echo "輸入值不合法" && exit for line in `seq 1 $lineNeeds`;do #打印當前行的空格 for((kong=(lineNeeds-line);kong>0;kong--));do echo -n " " done #打印當前行的星號 for((xing=1;xing<=(line*2-1);xing++));do echo -n "*" done echo done
2、用until循環實現國際象棋棋盤
#!/bin/bash # # # i=1 until [ $i -gt 8 ];do j=1 while [ $j -gt 8 ];do sum=`expr $i + $j` z=`expr $sum % 2` [ $z -eq 0 ] && echo -ne "\033[41;1m \033[0m"||echo -ne "\033[43;1m \033[0m" let j++ done echo let i++ done
原創文章,作者:NameLess,如若轉載,請注明出處:http://www.www58058.com/39029