【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