天天看點

Linux常用Shell腳本

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

144

145

146

147

148

149

150

151

152

153

154

155

156

157

158

159

160

161

162

163

164

165

166

167

168

169

170

171

172

173

174

175

176

177

178

179

180

181

182

183

184

185

186

187

188

189

190

191

192

193

194

195

196

197

198

199

200

201

202

203

204

205

206

207

208

209

210

211

212

213

214

215

216

217

218

219

220

221

222

223

224

225

226

227

228

229

230

231

232

233

234

235

236

237

238

239

240

241

242

243

244

245

246

247

248

249

250

251

252

253

254

255

256

257

258

259

260

261

262

263

264

265

266

267

268

269

270

271

272

273

274

275

276

277

278

279

280

281

282

283

284

285

286

287

288

289

290

291

292

293

294

295

296

297

298

299

300

301

302

303

304

305

306

307

308

309

310

311

312

313

314

315

316

317

318

319

320

321

322

323

324

325

326

327

328

329

330

331

332

333

334

335

336

337

338

339

340

341

342

343

344

345

346

347

348

349

350

351

352

353

354

355

356

357

358

359

360

361

362

363

364

365

366

367

368

369

370

371

372

373

374

375

376

377

378

379

380

381

382

383

384

385

386

387

388

389

390

391

392

393

394

395

396

397

398

399

400

401

402

403

404

405

406

407

408

409

410

411

412

413

414

415

416

417

418

419

420

421

422

423

424

425

426

427

428

429

430

431

432

433

434

435

436

437

438

439

440

441

442

443

444

445

446

447

448

449

450

451

452

453

454

455

456

457

458

459

460

461

462

463

464

465

466

467

468

469

470

471

472

473

474

475

476

477

478

479

480

481

482

483

484

485

486

487

488

489

490

491

492

493

494

495

496

497

498

499

500

501

502

503

504

505

506

507

508

509

510

511

512

513

514

515

516

517

518

519

520

521

522

523

524

525

526

527

528

529

530

531

532

533

534

535

536

537

538

539

540

541

542

543

544

545

546

547

548

549

550

551

552

553

554

555

556

557

558

559

560

561

562

563

564

565

566

567

568

569

570

571

572

573

574

575

576

577

578

579

580

581

582

583

584

585

586

587

588

589

590

591

592

593

594

595

596

597

598

599

600

<code>我們在運維中,尤其是linux運維,都知道腳本的重要性,腳本會讓我們的 運維事半功倍,是以學會寫腳本是我們每個linux運維必須學會的一門功課,這裡收藏linux運維常用的腳本。如何學好腳本,最關鍵的是就是大量的練習 和實踐。根據以下腳本我們可以拓展,這樣我們提高的很快!舉一反三!</code>

<code> </code> 

<code>1.用Shell程式設計,判斷一檔案是不是字元裝置檔案,如果是将其拷貝到 /dev 目錄下。</code>

<code>參考程式:</code>

<code>C代碼  收藏代碼</code>

<code>#!/bin/sh </code>

<code>FILENAME= </code>

<code>echo “Input file name:” </code>

<code>read FILENAME </code>

<code>if</code>

<code>[ -c</code><code>"$FILENAME"</code>

<code>] </code>

<code>then </code>

<code>cp $FILENAME /dev </code>

<code>fi  </code>

<code>2.設計一個shell程式,添加一個新組為class1,然後添加屬于這個組的30個使用者,使用者名的形式為stdxx,其中xx從01到30。</code>

<code>參考答案:</code>

<code>i=1 </code>

<code>groupadd class1 </code>

<code>while</code>

<code>[ $i -le 30 ] </code>

<code>do</code> 

<code>[ $i -le 9 ] ;then </code>

<code>USERNAME=stu0${i} </code>

<code>else</code> 

<code>USERNAME=stu${i} </code>

<code>fi </code>

<code>useradd $USERNAME </code>

<code>mkdir /home/$USERNAME </code>

<code>chown -R $USERNAME /home/$USERNAME </code>

<code>chgrp -R class1 /home/$USERNAME </code>

<code>i=$(($i+1)) </code>

<code>done </code>

<code>3.編寫shell程式,實作自動删除50個賬号的功能。賬号名為stud1至stud50。</code>

<code>[ $i -le 50 ] </code>

<code>userdel -r stud${i} </code>

<code>i=$(($i+1 )) </code>

<code>4.某系統管理者需每天做一定的重複工作,請按照下列要求,編制一個解決方案:</code>

<code>(1)在下午4 :50删除/abc目錄下的全部子目錄和全部檔案;</code>

<code>(2)從早8:00~下午6:00每小時讀取/xyz目錄下x1檔案中每行第一個域的全部資料加入到/backup目錄下的bak01.txt檔案内;</code>

<code>(3)每逢星期一下午5:50将/data目錄下的所有目錄和檔案歸檔并壓縮為檔案:backup.tar.gz;</code>

<code>(4)在下午5:55将IDE接口的CD-ROM解除安裝(假設:CD-ROM的裝置名為hdc);</code>

<code>(5)在早晨8:00前開機後啟動。</code>

<code>參考答案:</code>

<code>解決方案:</code>

<code>(1)用vi建立編輯一個名為prgx的crontab檔案;</code>

<code>(2)prgx檔案的内容:</code>

<code>50 16 * * * rm -r /abc/* </code>

<code>0 8-18/1 * * * cut -f1 /xyz/x1 &gt;;&gt;; /backup/bak01.txt </code>

<code>50 17 * * * tar zcvf backup.tar.gz /data </code>

<code>55 17 * * * umount /dev/hdc </code>

<code>(3)由超級使用者登入,用crontab執行 prgx檔案中的内容:</code>

<code>root@xxx:#crontab prgx;在每日早晨8:00之前開機後即可自動啟動crontab。</code>

<code>5.設計一個shell程式,在每月第一天備份并壓縮/etc目錄的所有内容,存放在/root/bak目錄裡,且檔案名為如下形式yymmdd_etc,yy為年,mm為月,dd為日。Shell程式fileback存放在/usr/bin目錄下。</code>

<code>(1)編寫shell程式fileback:</code>

<code>DIRNAME=`ls /root | grep bak` </code>

<code>[ -z</code><code>"$DIRNAME"</code>

<code>] ; then </code>

<code>mkdir /root/bak </code>

<code>cd /root/bak </code>

<code>YY=`date +%y` </code>

<code>MM=`date +%m` </code>

<code>DD=`date +%d` </code>

<code>BACKETC=$YY$MM$DD_etc.tar.gz </code>

<code>tar zcvf $BACKETC /etc </code>

<code>echo “fileback finished!” </code>

<code>(2)編寫任務定時器:</code>

<code>echo “0 0 1 * * /bin/sh /usr/bin/fileback” &gt;; /root/etcbakcron </code>

<code>crontab /root/etcbakcron </code>

<code>或使用crontab -e 指令添加定時任務: </code>

<code>0 1 * * * /bin/sh /usr/bin/fileback </code>

<code>6.有一普通使用者想在每周日淩晨零點零分定期備份/user/backup到/tmp目錄下,該使用者應如何做?</code>

<code>(1)第一種方法:</code>

<code>使用者應使用crontab –e 指令建立crontab檔案。格式如下: </code>

<code>0 0 * * sun cp –r /user/backup /tmp </code>

<code>(2)第二種方法:</code>

<code>使用者先在自己目錄下建立檔案file,檔案内容如下:</code>

<code>0 * * sun cp –r /user/backup /tmp </code>

<code>然後執行 crontab file 使生效。</code>

<code>7.設計一個Shell程式,在/userdata目錄下建立50個目錄,即user1~user50,并設定每個目錄的權限,其中其他使用者的權限為:讀;檔案所有者的權限為:讀、寫、執行;檔案所有者所在組的權限為:讀、執行。</code>

<code>參考答案: 建立程式 Pro16如下:</code>

<code>[ i -le 50 ] </code>

<code>[ -d /userdata ];then </code>

<code>mkdir -p /userdata/user$i </code>

<code>chmod 754 /userdata/user$i </code>

<code>echo “user$i” </code>

<code>let “i = i + 1″ (或i=$(($i+1)) </code>

<code>mkdir /userdata </code>

<code>8、mysql備份執行個體,自動備份mysql,并删除30天前的備份檔案</code>

<code>  </code> 

<code>#auto backup mysql </code>

<code>#wugk  2012-07-14 </code>

<code>#PATH DEFINE </code>

<code>BAKDIR=/data/backup/mysql/`date +%Y-%m-%d` </code>

<code>MYSQLDB=www </code>

<code>MYSQLPW=backup </code>

<code>MYSQLUSR=backup </code>

<code>if</code><code>[ $UID -ne 0 ];then </code>

<code>echo This script must use administrator or root user ,please</code><code>exit</code><code>! </code>

<code>sleep 2 </code>

<code>exit</code>

<code>0 </code>

<code>if</code><code>[ ! -d $BAKDIR ];then </code>

<code>mkdir -p $BAKDIR </code>

<code>echo This is $BAKDIR exists ,please</code><code>exit</code>

<code>…. </code>

<code>exit</code> 

<code>###mysqldump backup mysql </code>

<code>/usr/bin/mysqldump -u$MYSQLUSR -p$MYSQLPW -d $MYSQLDB &gt;/data/backup/mysql/`date +%Y-%m-%d`/www_db.sql </code>

<code>cd $BAKDIR ; tar -czf  www_mysql_db.tar.gz *.sql </code>

<code>cd $BAKDIR ;find  . -name “*.sql” |xargs rm -rf[ $? -eq 0 ]&amp;&amp;echo “This `date +%Y-%m-%d` RESIN BACKUP is SUCCESS” </code>

<code>cd /data/backup/mysql/ ;find . -mtime +30 |xargs rm -rf </code>

<code>9、自動安裝Nginx腳本,采用</code><code>case</code><code>方式,選擇方式,也可以根據實際需求改成自己想要的腳本</code>

<code>###nginx install shell </code>

<code>###wugk 2012-07-14 </code>

<code>###PATH DEFINE </code>

<code>SOFT_PATH=/data/soft/ </code>

<code>NGINX_FILE=nginx-1.2.0.tar.gz </code>

<code>DOWN_PATH=http:</code><code>//nginx.org/download/ </code>

<code>if</code><code>[ ! -d $SOFT_PATH ];then </code>

<code>mkdir -p $SOFT_PATH </code>

<code>download () </code>

<code>{ </code>

<code>cd $SOFT_PATH ;wget $DOWN_PATH/$NGINX_FILE </code>

<code>} </code>

<code>install () </code>

<code>yum install pcre-devel -y </code>

<code>cd $SOFT_PATH ;tar xzf $NGINX_FILE ;cd nginx-1.2.0/ &amp;&amp;./configure –prefix=/usr/local/nginx/ –with-http_stub_status_module –with-http_ssl_module </code>

<code>[ $? -eq 0 ]&amp;&amp;make &amp;&amp;make install </code>

<code>start () </code>

<code>lsof -i :80[ $? -ne 0 ]&amp;&amp;/usr/local/nginx/sbin/nginx </code>

<code>stop () </code>

<code>ps -ef |grep nginx |grep -v grep |awk ‘{print $2}’|xargs kill -9 </code>

<code>() </code>

<code>echo $? ;</code><code>exit</code> 

<code>###case menu ##### </code>

<code>case</code>

<code>$1 in </code>

<code>download ) </code>

<code>download </code>

<code>;; </code>

<code>install ) </code>

<code>install </code>

<code>start ) </code>

<code>start </code>

<code>stop ) </code>

<code>stop </code>

<code>* ) </code>

<code>echo “USAGE:$0 {download or install or start or stop}” </code>

<code>esac </code>

<code>10、批量解壓tar腳本,批量解壓zip并且建立目前目錄。</code>

<code>PATH1=/tmp/images </code>

<code>PATH2=/usr/www/images </code>

<code>for</code>

<code>i in `ls ${PATH1}/*` </code>

<code>tar xvf  $i  -C $PATH2 </code>

<code>這個腳本是針對所有tar檔案在一個目錄,但是實際情況中,有可能在下級或者更深的目錄,我們可以使用find查找</code>

<code>i in `find  $PATH1  -name  ”*.tar” ` </code>

<code>如何是zip檔案,例如123189.zip 132342.zip 等等批量檔案,預設unzip直接解壓不帶自身目錄,意思是解壓123189.zip完目前目錄就是圖檔,不能建立123189目錄下并解壓,可以用shell腳本實作</code>

<code>cd $PATH1 </code>

<code>i in `find  . -name  ”*.zip”|awk  -F.  {print $2} ` </code>

<code>mkdir -p   PATH2$i </code>

<code>unzip -o  .$i.zip  -d   PATH2$i </code>

<code>done  </code>

<code>原創文章轉載請注明: Linux常用Shell腳本珍藏 | 專注Unix/Linux領域</code>

<code>ssh 批量上傳檔案</code>

<code>上傳檔案大多數用的是ftp,但是用ftp有一點不好,就是本地和遠端的目錄要對應,這樣就要在多個目錄下去切換,這樣挺麻煩的,如果不注意的話,很有可能傳錯。是以想了個辦法利用scp來批量上傳檔案或者目錄。</code>

<code>一,scp上傳不要輸入密碼</code>

<code>如果要用scp來上傳檔案,第一步就要去掉scp上傳時要輸入密碼。要不然就沒辦法批量上傳了。具體請參考:ssh 不用輸入密碼</code>

<code>二,ssh批量上傳腳本</code>

<code>1,要上傳的檔案清單放到一個test檔案中</code>

<code>root@ubuntu:/home/zhangy# cat test   </code>

<code>/home/zhangy/test/aaa   </code>

<code>/home/zhangy/test/nginx.conf   </code>

<code>    </code> 

<code>/home/zhangy/test/test.sql   </code>

<code>/home/zhangy/test/pa.txt   </code>

<code>/home/zhangy/test/password   </code>

<code>上面就要上傳的檔案。</code>

<code>2,批量上傳的腳本</code>

<code>vim file_upload.sh</code>

<code>DATE=`date +%Y_%m_%d_%H` </code>

<code>[ $1 ] </code>

<code>  </code><code>for</code>

<code>file in $(sed</code><code>‘/^$/d‘</code>

<code>$1)    </code><code>//去掉空行 </code>

<code>  </code><code>do</code> 

<code>    </code><code>if</code>

<code>[ -f $file ]                </code><code>//普通檔案 </code>

<code>    </code><code>then </code>

<code>      </code><code>res=`scp $file $2:$file`     </code><code>//上傳檔案 </code>

<code>      </code><code>if</code>

<code>[ -z $res ]               </code><code>//上傳成功 </code>

<code>      </code><code>then </code>

<code>        </code><code>echo $file &gt;&gt; ${DATE}_upload.</code><code>log</code>  

<code>//上傳成功的日志 </code>

<code>      </code><code>fi </code>

<code>    </code><code>elif [ -d $file ]             </code><code>//目錄 </code>

<code>      </code><code>res=`scp -r $file $2:$file` </code>

<code>[ -z $res ] </code>

<code>        </code><code>echo $file &gt;&gt; ${DATE}_upload.</code><code>log</code> 

<code>    </code><code>fi </code>

<code>  </code><code>done </code>

<code>  </code><code>echo</code><code>"no file"</code>

<code>&gt;&gt; ${DATE}_error.</code><code>log</code> 

<code>上傳成功後,傳回的是一個空行,上傳不成功,什麼都不傳回</code>

<code>3,上傳的格式</code>

<code>./file_upload.sh test 192.168.1.13   </code>

<code>test是上傳清單檔案,192.168.1.13檔案要傳到的地方。</code>

<code>0</code>

<code>轉載請注明</code>

<code>作者:海底蒼鷹</code>

<code>位址:http:</code><code>//blog.51yip.com/linux/1356.html</code>

<code>1. 轉換檔案大小寫:</code>

<code>A script to convert the specified filenames to lower</code><code>case</code><code>.</code>

<code> </code><code># lowerit </code>

<code># convert all file names in the current directory to lower case </code>

<code># only operates on plain files--does not change the name of directories </code>

<code># will ask for verification before overwriting an existing file </code>

<code>x in `ls` </code>

<code>[ ! -f $x ]; then </code>

<code>        </code><code>continue</code> 

<code>    </code><code>lc=`echo $x  | tr</code><code>‘[A-Z]‘</code>

<code>‘[a-z]‘</code><code>` </code>

<code>[ $lc != $x ]; then </code>

<code>        </code><code>mv -i $x $lc </code>

<code>or</code>

<code>test $# = 0 </code>

<code>    </code><code>echo</code><code>"Usage $0: &lt;files&gt;"</code>

<code>1&gt;&amp;2 </code>

<code>    </code><code>exit</code>

<code>1 </code>

<code>filename in</code><code>"$@"</code> 

<code>    </code><code>new_filename=`echo</code><code>"$filename"</code>

<code>| tr A-Z a-z` </code>

<code>    </code><code>test</code><code>"$filename"</code>

<code>=</code><code>"$new_filename"</code>

<code>&amp;&amp;</code><code>continue</code> 

<code>test -r</code><code>"$new_filename"</code> 

<code>        </code><code>echo</code><code>"$0: $new_filename exists"</code>

<code>    </code><code>elif test -e</code><code>"$filename"</code> 

<code>        </code><code>mv</code><code>"$filename"</code>

<code>"$new_filename"</code> 

<code>    </code><code>else</code> 

<code>        </code><code>echo</code><code>"$0: $filename not found"</code>

<code>2. 看網站 Watch a Website</code>

<code>A script to repeated download a webpage until it matches a regex then notify an e-mail address.</code>

<code>For example to get e-mail when Kesha tickets (not</code><code>for</code>

<code>yourself of course) go on sale you might run:</code>

<code>% watch_website.sh http:</code><code>//ticketek.com.au/ ‘Ke[sS$]+ha‘ [email protected] </code>

<code>repeat_seconds=300  #check every 5 minutes </code>

<code>test $# = 3 </code>

<code>    </code><code>url=$1 </code>

<code>    </code><code>regexp=$2 </code>

<code>    </code><code>email_address=$3 </code>

<code>    </code><code>echo</code><code>"Usage: $0 &lt;url&gt; &lt;regex&gt;"</code>

<code>true</code> 

<code>wget -O- -q</code><code>"$url"</code><code>|egrep</code><code>"$regexp"</code>

<code>&gt;/dev/null </code>

<code>        </code><code>echo</code><code>"Generated by $0"</code>

<code>| mail -s</code><code>"$url now matches $regexp"</code>

<code>$email_address </code>

<code>        </code><code>exit</code>

<code>    </code><code>sleep $repeat_seconds </code>

<code>3. 轉GIF到PNG convert GIF files to PNG</code>

<code>This scripts converts GIF files to PNG files via the intermediate PPM format.</code>

<code>[ $# -eq 0 ] </code>

<code>    </code><code>echo</code><code>"Usage: $0 files..."</code>

<code>! type giftopnm 2&gt;/dev/null </code>

<code>    </code><code>echo</code><code>"$0: conversion tool giftopnm not found "</code>

<code># missing "in ..." defaults to in "$@" </code>

<code>f </code>

<code>    </code><code>case</code>

<code>"$f"</code> <code>in </code>

<code>    </code><code>*.gif) </code>

<code>        </code><code># OK, do nothing </code>

<code>        </code><code>;; </code>

<code>    </code><code>*) </code>

<code>        </code><code>echo</code><code>"gif2png: skipping $f, not GIF"</code> 

<code>    </code><code>esac </code>

<code>    </code><code>dir=`dirname</code><code>"$f"</code><code>` </code>

<code>    </code><code>base=`basename</code><code>"$f"</code>

<code>.gif` </code>

<code>    </code><code>result=</code><code>"$dir/$base.png"</code> 

<code>    </code><code>giftopnm</code><code>"$f"</code>

<code>| pnmtopng &gt; $result &amp;&amp; echo</code><code>"wrote $result"</code> 

<code>4.  計數 Counting</code>

<code>A utility script to print the sub-range of integers specified by its arguments.</code>

<code>Useful to use on the command line or from other scripts</code>

<code>test $# = 1 </code>

<code>    </code><code>start=1 </code>

<code>    </code><code>finish=$1 </code>

<code>elif test $# = 2 </code>

<code>    </code><code>start=$1 </code>

<code>    </code><code>finish=$2 </code>

<code>    </code><code>echo</code><code>"Usage: $0 &lt;start&gt; &lt;finish&gt;"</code>

<code>argument in</code><code>"$@"</code> 

<code>echo</code><code>"$argument"</code><code>|egrep -v</code><code>‘^-?[0-9]+$‘</code>

<code>        </code><code>echo</code><code>"$0: argument ‘$argument‘ is not an integer"</code>

<code>number=$start </code>

<code>test $number -le $finish </code>

<code>    </code><code>echo $number </code>

<code>    </code><code>number=`expr $number + 1`    # or number=$(($number + 1)) </code>

<code>5. 字頻率 Word Frequency</code>

<code>Count the number of</code><code>time</code>

<code>each different word occurs in the files given as arguments.</code>

<code>sed</code><code>‘s/ /\n/g‘</code>

<code>"$@"</code><code>|      # convert to one word per line </code>

<code>tr A-Z a-z|               # map uppercase to lower</code><code>case</code> 

<code>sed</code><code>"s/[^a-z‘]//g"</code><code>|       #</code><code>remove</code>

<code>all characters except a-z and ‘   </code>

<code>egrep -v</code><code>‘^$‘</code><code>|             #</code><code>remove</code>

<code>empty lines </code>

<code>sort|                     # place words in alphabetical order </code>

<code>uniq -c|                  # use uniq to count how many times each word occurs </code>

<code>sort -n                   # order words in frequency of occurrance </code>

<code> </code><code>For example</code>

<code>% cd /home/cs2041/public_html/lec/shell/examples </code>

<code>% ./word_frequency.sh dracula.txt|tail </code>

<code>   </code><code>2124 it </code>

<code>   </code><code>2440 that </code>

<code>   </code><code>2486 in </code>

<code>   </code><code>2549 he </code>

<code>   </code><code>2911 a </code>

<code>   </code><code>3600 of </code>

<code>   </code><code>4448 to </code>

<code>   </code><code>4740 i </code>

<code>   </code><code>5833 and </code>

<code>   </code><code>7843 the </code>

<code>6. Finding</code>

<code>Search $PATH</code><code>for</code>

<code>the specified programs</code>

<code>    </code><code>echo</code><code>"Usage $0: &lt;program&gt;"</code>

<code>program in</code><code>"$@"</code> 

<code>    </code><code>program_found=</code><code>‘‘</code> 

<code>    </code><code>for</code>

<code>directory in `echo</code><code>"$PATH"</code>

<code>| tr</code><code>‘:‘</code> <code>‘ ‘</code><code>` </code>

<code>    </code><code>do</code> 

<code>        </code><code>f=</code><code>"$directory/$program"</code> 

<code>        </code><code>if</code>

<code>test -x</code><code>"$f"</code> 

<code>        </code><code>then </code>

<code>            </code><code>ls -ld</code><code>"$f"</code> 

<code>            </code><code>program_found=1 </code>

<code>        </code><code>fi </code>

<code>    </code><code>done </code>

<code>test -z $program_found </code>

<code>        </code><code>echo</code><code>"$program not found"</code> 

<code>Alternative implementation</code><code>using</code>

<code>while</code><code>, and a cute use of grep and ||</code>

<code>    </code><code>echo</code><code>"$PATH"</code><code>| </code>

<code>    </code><code>tr</code><code>‘:‘</code>

<code>‘\n‘</code><code>| </code>

<code>    </code><code>while</code>

<code>read directory </code>

<code>    </code><code>done| </code>

<code>    </code><code>egrep</code><code>‘.‘</code>

<code>|| echo</code><code>"$program not found"</code> 

<code>And another implementation</code><code>using</code>

<code>    </code><code>n_path_components=`echo $PATH|tr -d -c :|wc -c` </code>

<code>    </code><code>index=1 </code>

<code>test $index -le $n_path_components </code>

<code>        </code><code>directory=`echo</code><code>"$PATH"</code><code>|cut -d: -f$index` </code>

<code>        </code><code>index=`expr $index + 1` </code>

<code>    </code><code>test -n $program_found || echo</code><code>"$program not found"</code> 

<code>來源: http:</code><code>//www.cse.unsw.edu.au/~cs2041/12s2/lec/shell/examples.notes.html</code>