Linux shell腳本編程(二) 1 練習:求100以內所有偶數之和; 2 使用至少三種方法實現; 3 4 示例1: 5 6 #!/bin/bash 7 # 8 declare -i sum=0 #聲明一個變數求和,初始值為0 9 10 for i in $(seq 0 2 100); do 1
Linux shell腳本編程(二)
1 練習:求100以內所有偶數之和; 2 使用至少三種方法實現; 3 4 示例1: 5 6 #!/bin/bash 7 # 8 declare -i sum=0 #聲明一個變數求和,初始值為0 9 10 for i in $(seq 0 2 100); do 11 sum=$(($sum+$i)) 12 done 13 14 echo "Even sum: $sum." 15 16 示例2: 17 18 #!/bin/bash 19 # 20 declare -i sum=0 21 22 for i in {1..100}; do 23 if [ $[$i%2] -eq 0 ]; then 24 sum=$[$sum+$i] 25 fi 26 done 27 28 echo "Even sum: $sum." 29 30 增強型賦值: 31 += 32 sum=$[$sum+$i] 33 let sum+=$i 34 -=,*=,/=,%=, 35 36 let count=$[$conunt+1] -->let count+=1-->let count++ 37 let count=$[$conunt-1] -->let count-=1-->let count-- 38 39 40 示例:顯示/etc目錄下所有的每個普通文件,而後統計一共有多少個這樣的文件; 41 42 #!/bin/bash 43 # 44 declare -i count=0 45 46 for file in /etc/*; do 47 if [ -f $file ]; then 48 let count++ 49 echo "$count $file" 50 fi 51 done 52 53 echo "Total: $count files." 54 55 56 測試表達式: 57 整數測試;-gt,-lt,-ge,-le,-eq,-ne 58 字元串測試:==,>,<,!=,-z,-n,=~ 59 60 註意: 61 (1)字元串等會比較測試[ "$hostname" == 'localhost' ] 62 (2)模式匹配測試:[[ "STRING" -~ PATTERN ]] 63 64 示例:寫一個腳本實現如下功能; 65 獲取當前主機的主機名: 66 如果當前主機的主機名為空,或者為localhost,則將其修改為www.mageedu.com 67 68 組合測試條件: 69 條件間邏輯運算: 70 與:多個條件要同時滿足; 71 或:多個條件滿足其一即可; 72 非:對指定的條件取反; 73 74 表達式組合: 75 與:[[ CONDITION -a CONDITION2 ]] 76 或:[[ CONDITION -o CONDITION2 ]] 77 非:[ !CONDITION ] 78 79 命令組合: 80 與:COMMAND1 && COMMAND2 <-- [ EXPR1 ] && [ EXPR2 ] 81 或:COMMAND1 || COMMAND2 82 非:!COMMAND 83 84 false && true = false 85 false && false = false 86 87 true && false = true 88 true && true = true 89 90 if COMMAND; then 91 COMMAND2 92 fi 93 短路操作符: 94 true || true = true 95 true || false = true 96 97 false || true = true 98 false || false = false 99 100 if ! COMMAND1; then 101 COMMAND2 102 fi 103 104 COMMAND1 && COMMAND2 || COMMAND3 105 if COMMAND1;then 106 COMMAND2 107 else 108 COMMAND3 109 fi 110 111 獲取當前主機的主機名: 112 如果當前主機的主機名為空,或者為localhost,則將其修改為www.mageedu.com 113 114 #!/bin/bash 115 # 116 hostname=$(hostname) 117 118 if [ -z "$hostname" -o "$hostname"=="localhost" ]; then 119 hostname www.magedu.com 120 fi 121 122 練習:寫一個腳本 123 (1)傳遞兩個文本文件路徑給腳本; 124 (2)顯示兩個文件中空白行數較多的文件及其空白行的個數; 125 (3)顯示兩個文件中總行數較多的文件及其總行數; 126 練習:寫一個腳本 127 (1)提示用戶輸入一個字元串; 128 (2)判斷: 129 如果輸入的是quit,則退出腳本; 130 否則,則顯示其輸入的字元串內容; 131 132 練習:寫一個腳本,列印九九乘法表: 133 迴圈嵌套 134 135 #!/bin/bash 136 # 137 for j in {1..9}; do 138 for i in $(seq 1 $j); do 139 echo -n -e "${i}X${j}=$[$i*$j]\t" 140 done 141 echo 142 done 143 144 多分支的if語句: 145 單分支: 146 if CONDITION; then 147 if-true-分支 148 fi 149 雙分支: 150 if CONDITION; then 151 if-true-分支 152 else 153 if-false-分支 154 fi 155 156 多分支: 157 if CONDITION1; then 158 if -CONDITION-true-分支 159 elif CONDITION2; then 160 if-CONDITION2-true-分支 161 ... 162 else 163 if-ALL-false-分支 164 fi 165 166 示例:通過腳本參數傳遞一個文件路徑給腳本,判斷其類型: 167 168 #!/bin/bash 169 # 170 if [ $# -lt 1 ]; then 171 echo "Usage: $0 <path>" 172 exit 1 173 fi 174 175 if [ -f $1 ]; then 176 echo "Rgulat file." 177 elif [ -d $1 ]; then 178 echo "Directory." 179 elif [ -h $1 ]; then 180 echo "Symbolic link." 181 elif [ -b $1 ]; then 182 echo "Block special." 183 elif [ -c $1 ]; then 184 echo "Charactoer special." 185 elif [ -S $1 ]; then 186 echo "Socket file." 187 else 188 echo "file not exist or unknow type." 189 fi 190 191 示例:腳本可接受四個參數 192 start:創建文件/var/lock/subsys/SCRIPT_NAME 193 stop:刪除此文件 194 restatr:刪除此文件並重新創建 195 status:如果文件存在,顯示為“running”;否則,顯示為“stopped” 196 197 basename命令: 198 取得路徑的基名: 199 示例: 200 201 #!/bin/bash 202 # 203 prog=$(basename $0) 204 lockfile="/var/lock/subsys/$prog" 205 #echo $lockfile 206 207 if [ $# -lt 1 ]; then 208 echo "Usage: $prog start|stop|restart|status" 209 exit 1 210 fi 211 212 if [ "$1" == "start" ]; then 213 if [ -f $lockfile ]; then 214 echo "$prog is started yes." 215 else 216 touch $lockfile && echo "Starting $prog ok..." || echo "Starting $prog failed.." 217 fi 218 elif [ "$1" == "stop" ]; then 219 if [ -f $lockfile ]; then 220 rm -f $lockfile && echo "Stop $prog ok..." || echo "Stop $prog failed.." 221 else 222 echo "$prog is stopped yet." 223 fi 224 elif [ "$1" == "restart" ]; then 225 if [ -f $lockfile ]; then 226 rm -f $lockfile && touch $lockfile && echo "Restart $prog ok..." 227 else 228 touch $lockfile && echo "$prog is stopped, Starting $prog ok..." 229 fi 230 elif [ "$1" == "status" ]; then 231 if [ -f $lockfile ]; then 232 echo "Running..." 233 else 234 echo "Stopped..." 235 fi 236 else 237 echo "Usage: $prog start|stop|restart|status" 238 exit 1 239 fi 240 241 case語句: 242 簡潔版多分支if語句: 243 使用場景:判斷某變數的值是否為多種情形中的一種時使用; 244 245 語法: 246 case $VARIABLE in 247 PATTERN1) 248 分支1 249 ;; 250 PATTERN2) 251 分支2 252 ;; 253 PATTERN3 254 分支3 255 ;; 256 ... 257 *) 258 分支n 259 ;; 260 esac 261 262 PATTERN可使用glob模式的通配符: 263 *:任意長度的任意字元; 264 ?:任意單個字元; 265 []:指定範圍內的任意單個字元; 266 a|b:多選1; 267 268 示例:提示鍵入任意一個字元,判斷類型: 269 腳本如下: 270 #!/bin/bash 271 # 272 read -p "Plz enter a character: " char 273 274 case $char in 275 [a-z]) 276 echo "A character." 277 ;; 278 [0-9]) 279 echo "A digit." 280 ;; 281 *) 282 echo "A special character." 283 ;; 284 esac 285 286 示例:腳本可接受四個參數 287 start:創建文件/var/lock/subsys/SCRIPT_NAME 288 stop:刪除此文件 289 restatr:刪除此文件並重新創建 290 status:如果文件存在,顯示為“running”;否則,顯示為“stopped” 291 292 腳本如下: 293 294 #!/bin/bash 295 # 296 prog=$(basename $0) 297 lockfile="/var/lock/subsys/$prog" 298 #echo $lockfile 299 300 if [ $# -lt 1 ]; then 301 echo "Usage: $prog start|stop|restart|status" 302 exit 1 303 fi 304 case $1 in 305 start) 306 if [ -f $lockfile ]; then 307 echo "$prog is started yes." 308 else 309 touch $lockfile && echo "Starting $prog ok..." || echo "Starting $prog failed.." 310 fi 311 ;; 312 stop) 313 if [ -f $lockfile ]; then 314 rm -f $lockfile && echo "Stop $prog ok..." || echo "Stop $prog failed.." 315 else 316 echo "$prog is stopped yet." 317 fi 318 ;; 319 restart) 320 if [ -f $lockfile ]; then 321 rm -f $lockfile && touch $lockfile && echo "Restart $prog ok..." 322 else 323 touch $lockfile && echo "$prog is stopped, Starting $prog ok..." 324 fi 325 ;; 326 status) 327 if [ -f $lockfile ]; then 328 echo "Running..." 329 else 330 echo "Stopped..." 331 fi 332 ;; 333 *) 334 echo "Usage: $prog start|stop|restart|status" 335 exit 1 336 esac