精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

適合系統管理新手的bash腳本編程

運維 系統運維
如果您是 Linux® 或 UNIX® 管理新手,希望盡快掌握 bash 腳本編程技術,或者希望在 Windows 系統上運行 Cygwin UNIX 子 shell 這樣的東西,就需要了解 bash shell 腳本編程的基本知識。學習在 UNIX 或 Linux 系統上使用 bash 的日常方法;了解如何通過把 bash 命令連接在一起完成更復雜的任務;研究 bash 中的變量、語法結構和循環。

 UNIX shell 實質上是用戶、內核和系統硬件之間的接口。在任何 UNIX 或 Linux 系統上,shell 都是非常重要的,是學習正確的系統管理和安全保護最關鍵的方面之一。shell 通常由 CLI 驅動,可以直接控制或破壞系統。本文討論的開放源碼的 bash shell 是***大、最實用、可擴展性***的 shell 之一。在本文中,您將學習 bash 腳本編程的基本技術、日常使用方法以及用它創建可靠的 shell 腳本的方法。

常用縮略詞

·API:應用程序編程接口

·CLI:命令行接口

·SNMP:簡單網絡管理協議

bash shell 的歷史

Bourne Again Shell (bash) 誕生于 1987 年,是作為 GNU 項目開發的,許多 Linux 發行版很快就采用了它。當前,有許多不同的 bash 版本可免費使用。

bash 的優點之一是它具有內置的安全特性。bash 會準確地記錄用戶輸入的命令,并把記錄寫到用戶主目錄中的隱藏文件 .bash_history 中。因此,如果實現 bash,就很容易更緊密地跟蹤系統用戶。實際上,對于許多 Linux 系統,bash 常常是預安裝的默認 shell 環境。

bash 的命令語法和關鍵詞源于 Korn shell (ksh) 和 C shell (csh) 的架構和技術細節并做了改進。另外,bash 的語法具有其他 shell 所沒有的許多擴展。與其他 shell 相比,bash 中的整數計算更高效,而且 bash 可以更方便地重定向標準輸出(stdout)和標準錯誤(stderr)。

bash 還非常適合于安全性要求高的環境,它具有受限制的啟動模式,可以把 shell 中的用戶限制為只能執行一組確定的命令。可以通過編輯自己的 bash shell 登錄控制文件(即 .bashrc、.bash_profile、.bash_logout 和 .profile 等隱藏文件)定制登錄 shell。#p#

bash shell 的用法和功能

要想編寫有效的 bash shell 腳本,就必須掌握在 shell 中執行導航和日常任務的基本 bash 命令集。

bash 登錄過程

在登錄時,用戶通常執行一個全局概要文件和兩個個人文件(.bash_profile 和 .bashrc)。圖 1 顯示通常的過程。

bash shell 登錄過程

圖 1. bash shell 登錄過程

 


 

現在,看看 Linux 用戶典型的 .bash_profile(清單 1)和 .bashrc(清單 2)腳本。這些腳本是從用戶的主目錄裝載的。

清單 1. 典型的 .bash_profile 文件

[fred.smythe@server01 ~]$ cat .bash_profile

# .bash_profile

# Get the aliases and functions

if [ -f ~/.bashrc ]; then

. ~/.bashrc

fi

# User specific environment and startup programs

export JAVA_HOME=/usr/java/default

export PATH=$JAVA_HOME/bin:$PATH

PATH=$PATH:$HOME/bin

export PATH

在 清單 2 中的 .bashrc 文件中,配置了一些用戶別名并裝載了全局 bashrc 文件(如果存在的話)。

清單 2. 典型的 .bashrc 文件

[fred.smythe@server01 ~]$ cat .bashrc

# .bashrc

# User specific aliases and functions

alias rm='rm -i'

alias cp='cp -i'

alias mv='mv -i'

alias tc6='cd /opt/tomcat/6.0.13'

alias conf6='cd /opt/tomcat/6.0.13/conf'

alias bin6='cd /opt/tomcat/6.0.13/bin'

alias scr='cd /opt/tomcat/scripts'

alias reports='cd /opt/tomcat/reports'

alias temp6='cd /opt/tomcat/6.0.13/template'

# Source global definitions

if [ -f /etc/bashrc ]; then

. /etc/bashrc

fi

 

bash shell 登錄過程細節

圖 2. bash shell 登錄過程細節

 


 

在此之后,用戶就可以使用 bash shell 環境變量 $PATH 中指定的標準命令集。如果某個命令不在用戶的 $PATH 中,但是該用戶有執行此命令的權限,那么必須使用完整的路徑,見 清單 3。

清單 3. bash shell 中的 $PATH 問題示例

[fred.smythe@server01 ~]$ ifconfig -a

-bash: ifconfig: command not found

[fred.smythe@server01 ~]$ which ifconfig

/usr/bin/which: no ifconfig in (/usr/local/bin:/bin:/usr/bin:/home/fred.smythe/bin)

出現此問題的原因是二進制程序 ifconfig 不在用戶定義的 PATH 變量中。但是,如果知道此命令的完整路徑,就可以像 清單 4 這樣執行它。

清單 4. 使用命令的完整路徑解決 bash shell 中的 $PATH 問題

[fred.smythe@server01 ~]$ /sbin/ifconfig -a

eth0 Link encap:Ethernet HWaddr 00:50:56:96:2E:B3

inet addr:10.14.33.60 Bcast:10.14.33.255 Mask:255.255.255.0

清單 5 演示一種使用別名解決此問題的方法。在 bash 腳本中,可能希望用完整路徑運行命令,這取決于誰將運行腳本。

清單 5. 通過設置別名解決 bash shell 中的 $PATH 問題

[fred.smythe@server01 ~]$ alias ifconfig='/sbin/ifconfig'

[fred.smythe@server01 ~]$ ifconfig

eth0 Link encap:Ethernet HWaddr 00:50:56:96:2E:B3

inet addr:10.14.33.60 Bcast:10.14.33.255 Mask:255.255.255.0

UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1

forking

命令或 bash shell 本身可能啟動(或生成)新的 shell 子進程以執行某一任務,這稱為 forking。當這個新進程(子進程)正在執行時,父進程仍然在運行。如果父進程先于子進程死亡,那么子進程就成了死進程(也稱為僵尸進程 ),這常常會導致進程或應用程序掛起。因此,必須以非常規方法殺死或終止掛起的進程。盡管父進程可以訪問其子進程的進程 ID 并向它傳遞參數,但是反過來不行。當 shell 腳本進程退出或返回到父進程時,退出碼應該是 0。如果是其他值,那么進程很可能出現了錯誤或問題。

執行的***一個命令的退出碼(echo $?)見 清單 6。

清單 6. 退出碼示例

# ls -ld /tmp

drwxrwxrwt 5 root root 4096 Aug 19 19:45 /tmp

[root@server01 ~]# echo $?

0 // Good command return of 0.

[root@server01 ~]# ls -l /junk

ls: /junk: No such file or directory

[root@server01 ~]# echo $?

2 // Something went wrong, there was an error, so return 2.

清單 7 演示 bash 環境中的父進程和子進程。

清單 7. bash 環境中的父進程和子進程示例

[root@server02 htdocs]# ps -ef | grep httpd

UID PID PPID C STIME TTY TIME CMD

root 8495 1 0 Jul26 ? 00:00:03 /usr/sbin/httpd -k start

apache 9254 8495 0 Aug15 ? 00:00:00 /usr/sbin/httpd -k start

#p#

了解自己的環境

如果輸入命令 env,就會看到 bash shell 默認環境變量當前設置的值,包括您的用戶名和 tty(終端)信息、$PATH 值和當前工作目錄($PWD)。請看一下 清單 8。

清單 8. bash 環境的示例

[fred.smythe@server01 ~]$ env

HOSTNAME=server01

TERM=screen

SHELL=/bin/bash

HISTSIZE=1000

SSH_CLIENT=10.12.132.3 56513 22

SSH_TTY=/dev/pts/0

USER=fred.smythe

LS_COLORS=no=00:fi=00:di=01;34:ln=01;36:pi=40;33:so=01;35:bd=40;33;01:cd=40;33;01:or=01;05

;37;41:mi=01;05;37;41:ex=01;32:*.cmd=01;32:*.exe=01;32:*.com=01;32:*.btm=01;32:*.bat=01;32

:*.sh=01;32:*.csh=01;32:*.tar=01;31:*.tgz=01;31:*.arj=01;31:*.taz=01;31:*.lzh=01;31:*.zip=

01;31:*.z=01;31:*.Z=01;31:*.gz=01;31:*.bz2=01;31:*.bz=01;31:*.tz=01;31:*.rpm=01;31:*.cpio=

01;31:*.jpg=01;35:*.gif=01;35:*.bmp=01;35:*.xbm=01;35:*.xpm=01;35:*.png=01;35:*.tif=01;35:

MAIL=/var/spool/mail/fred.smythe

PATH=/usr/local/bin:/bin:/usr/bin:/home/fred.smythe/bin

INPUTRC=/etc/inputrc

PWD=/home/fred.smythe

LANG=en_US.UTF-8

SHLVL=1

HOME=/home/fred.smythe

LOGNAME=fred.smythe

SSH_CONNECTION=10.14.43.183 56513 10.14.43.43 22

LESSOPEN=|/usr/bin/lesspipe.sh %s

G_BROKEN_FILENAMES=1

_=/bin/env

文件系統導航

可以使用 清單 9 所示的 bash 命令導航 Linux 文件系統。

清單 9. 在 bash 環境中導航

[fred.smythe@server01 ~]$ ls -l

total 0

[fred.smythe@server01 ~]$ cd /tmp

[fred.smythe@server01 tmp]$ df -ha .

Filesystem Size Used Avail Use% Mounted on

/dev/mapper/vg_root-lv_tmp

2.0G 68M 1.8G 4% /tmp

在此清單中,每次只執行一個命令。但是,也可以使用分號(;)分隔符一起運行它們,見 清單 10。

清單 10. 在 bash 中連續執行命令

[fred.smythe@server01 tmp]$ ls -l ;cd /tmp;df -ha .

total 40

-rw-r----- 1 root root 1748 May 22 2009 index.html

-rw-r----- 1 root root 786 Aug 17 04:59 index.jsp

drwx------ 2 root root 16384 Jul 15 2009 lost+found

drwx------ 2 root root 4096 Aug 9 21:04 vmware-root

Filesystem Size Used Avail Use% Mounted on

/dev/mapper/vg_root-lv_tmp

2.0G 68M 1.8G 4% /tmp

[fred.smythe@server01 tmp]$

在 bash 命令行上,命令補全特性可以減少日常任務所需的輸入量。只需輸入命令的開頭,然后按 Tab 鍵。注意,如果由于權限限制無法訪問某個命令或文件,那么命令補全也無效。

在 bash 中獲得幫助

bash 提供幾種形式的幫助:

·man:

清單 11. bash 中的手冊頁示例

[fred.smythe@server01 tmp]$ man perl

PERL(1) Perl Programmers Reference Guide PERL(1)

NAME

perl - Practical Extraction and Report Language

SYNOPSIS

perl [ -sTtuUWX ] [ -hv ] [ -V[:configvar] ] -cw ] [ -d[t][:debugger] ] [ -D

[num- ber/list] ] [ -pna ] [ -Fpattern ] [ -l[octal] ] [ -0[octal/hexadecimal] ]

[ -Idir ] [ -m[-]module ] [ -M[-] module... ] [ -f ] [ -C [number/list] ]

[ -P ] [ -S ] [ -x[dir] ] [ -i[extension] ] [ -e command ] [ -- ]

[ program- file ] [ argument ]...

·whatis:

清單 12. bash 中的 whatis 命令示例

[fred.smythe@server01 tmp]$ whatis perl

perl (1) - Practical Extraction and Report Language

perl (rpm) - The Perl programming language

·apropos:

清單 13. bash 中的 apropos 示例

[root@server01 ~]# apropos perl | more

B (3pm) - The Perl Compiler

B::Asmdata (3pm) - Autogenerated data about Perl ops,

used to generate bytecode

B::Assembler (3pm) - Assemble Perl bytecode

·which:

清單 14. bash 中的 which 命令

[root@server01 ~]# which perl

/usr/bin/perl

bash shell 包含兩類命令:內部的內置命令 和外部程序(或外部篩選器和命令,它們通常是自含的二進制程序文件)。清單 15 說明如何使用 alias 命令在 bash 中尋找內置命令。

清單 15. 在 bash 中尋找內置命令

[root@server01 ~]# man -k builtins| more

. [builtins] (1) - bash built-in commands, see bash(1)

: [builtins] (1) - bash built-in commands, see bash(1)

[ [builtins] (1) - bash built-in commands, see bash(1)

alias [builtins] (1) - bash built-in commands, see bash(1)

bash [builtins] (1) - bash built-in commands, see bash(1)

bg [builtins] (1) - bash built-in commands, see bash(1)

bind [builtins] (1) - bash built-in commands, see bash(1)

break [builtins] (1) - bash built-in commands, see bash(1)

builtin [builtins] (1) - bash built-in commands, see bash(1)

可以使用 type 命令在 bash 中尋找特定的命令,見 清單 16。

清單 16. 使用 type 命令尋找內置命令

[root@apache-02 htdocs]# type lsof

lsof is /usr/sbin/lsof

[root@apache-02 htdocs]# type alias

alias is a shell builtin

清單 17 給出外部命令 lsof 的示例。此命令實際上是駐留在 Linux 文件系統中的二進制文件;它是通過同名的包安裝的。

清單 17. 在 bash 中尋找外部命令詳細信息

[root@server01 ~]# which lsof

/usr/sbin/lsof

[root@server01 ~]# rpm -qa lsof-4.78-3.i386

[root@server01 ~]# rpm -qa lsof

lsof-4.78-3.i386

#p#

即時 bash 腳本編程

bash shell ***大的特性之一是允許即時命令行腳本編程。比如 清單 18 中的示例,它設置一個 shell 變量,檢查變量的值,如果值大于零,就自動地執行另一個命令。

清單 18. 用 bash 進行即時腳本編程

[fred.smythe@server01 ~]$ DEBUG=1

[fred.smythe@server01 ~]$ test $DEBUG -gt 0 && echo "Debug turned on"

Debug turned on

下面是即時編寫的 for 循環示例(見 清單 19)。注意,這里在 shell 提示下交互地輸入;在每個 > 后面,輸入交互式 shell 腳本的下一行。

清單 19. 在 bash 中即時編寫的 for 循環

$ for SVR in 1 2 3

> do

> echo server0$SVR.example.com

> done

server01.example.com

server02.example.com

server03.example.com

注意,也可以將此代碼作為分號分隔的連續命令予以運行。

使用關鍵詞

for 命令并不是程序,而是稱為關鍵詞 的特殊內置命令。Linux 上一般 bash 版本的關鍵詞列表見 清單 20。

清單 20. bash 中的關鍵詞

true, false, test, case, esac, break, continue, eval, exec, exit, export, readonly,

return, set, shift, source, time, trap, unset, time, date, do, done, if, fi, else, elif,

function, for, in, then, until, while, select

在為 shell 變量選擇名稱時,應該避免使用這些關鍵詞(也稱為 bash shell 保留字)。

在 bash 中用管道輸送命令

bash shell 允許重定向 Linux 或 UNIX 系統上的標準輸入、標準輸出和標準錯誤。請看 清單 21 中的示例。

清單 21. 在 bash 中用管道輸送命令

$ USER="fred.smythe"

$ echo -n "User $USER home is: " && cat /etc/passwd | grep $USER | awk -F: '{print $6}'

User fred.smythe home is: /home/fred.smythe

$

# Re-direction of standard output (>) of the date command to a file :

[root@server01 ~]# date > /tmp/today.txt

[root@server01 ~]# cat /tmp/today.txt

Thu Aug 19 19:38:33 UTC 2010

# Re-direction of standard input (<) to standard output (>) …

[root@server01 ~]# cat < /tmp/today.txt > /tmp/today.txt.backup

[root@server01 ~]# cat /tmp/today.txt.backup

Thu Aug 19 19:38:33 UTC 2010

復合命令行

復合命令行可以使用和組合標準輸入、標準輸出和標準錯誤重定向和/或管道的多個實例,從而執行具有較高準確性的復雜操作。清單 22 提供一個示例。

清單 22. 在 bash 中執行重定向的示例

# command1 < input_file1.txt > output_file1.txt

# command1 | command2 | command3 > output_file.log

例如,通過使用復雜的組合命令行,可以搜索找到的所有壓縮的錯誤日志并統計錯誤數量,由此查明 Apache 拒絕權限錯誤的數量。

$ find ./ -name 'error_log.*.gz' | xargs zcat | grep 'Permission denied'| wc -l

3

#p#

編寫高質量的 bash 腳本

要想完成生產質量或企業級的腳本編程,必須記住以下幾個要點:

·一定要用簡短的標題注釋腳本。

·要加上足夠的注釋,這樣以后就可以輕松地想起原來編寫代碼的原因。請記住,腳本的***行必須是 #!/bin/bash 行。

·應該把腳本的操作記錄在日志文件中并加上日期和時間戳,以便日后檢查。輸出應該很詳細,應該記錄成功消息并清楚地表述錯誤消息或條件。記錄腳本的啟動和停止時間也可能有意義。可以使用 tee 命令把消息同時寫到日志和標準輸出:

DATEFMT=`date "+%m/%d/%Y %H:%M:%S"`

echo "$DATEFMT: My message" | tee -a /tmp/myscript.log

·如果腳本要寫入日志文件,那么應該創建新的日志文件,并在日志文件名中包含日期、小時、分鐘甚至秒。這樣的話,在每次運行腳本時,可以使用簡單的 find 命令循環和壓縮腳本的日志:

DATELOG=`date "+%m%d%y"`

LOGFILE="/data/maillog/mail_stats.log.$DATELOG"

# gzip the old mail_stats logs, older than 7 days

find /logs -type f -name "mail_stats.log.????????????" -mtime +7 | xargs gzip -9

# remove the old gzipped mail_stats logs after 30 days

find /logs -type f -name "mail_stats.log.*.gz" -mtime +30 -exec rm {} \;

# mail_log utility log resets

echo "" > /var/log/mail_stats.log.$DATELOG

·應該在腳本中加入錯誤檢查邏輯,不要假設任何東西是正確的。這樣做會減少日后的很多麻煩和挫折。

·盡可能在腳本中使用函數和 shell 腳本庫(通過導入另一個腳本)。這樣做可以重用經過測試的可靠的代碼,避免重復編寫腳本代碼并減少錯誤。

·要對用戶提供的輸入參數進行篩選:

NUMPARAMETERS="$#"

if [ $NUMPARAMETERS != 3 ];then

echo "Insufficient number of parameter passed!”

echo “Please run script in format ./myscript.sh $1 $2 $3”

exit 2

fi

·考慮在腳本中增加調試模式或功能 — 比如使用 set –x 命令。

·在腳本中添加對某些事件發出警報的功能。可以使用 SNMP 命令或聽得到的鈴聲(echo x)發出警報,然后用 mail 命令發送電子郵件。

·如果用戶將像使用交互式菜單那樣使用您編寫的腳本,那么要考慮用戶的環境 shell 和他們有權訪問的命令。如果不確定,那么腳本中的所有命令都應該使用完整路徑。

·在 bash shell 腳本中添加獨特的返回碼。這樣的話,在編寫大腳本時,可以根據返回碼輕松地找到發生錯誤或問題的準確位置:

if [ “$ERRCHECK” != “” ];then

echo “Error Detected : $ERRCHECK ! Cannot continue, exit $EXITVAL value”

exit $EXITVAL

fi

·在試驗室環境中,針對可能出現的所有情況全面測試腳本。還應該讓其他用戶對腳本執行測試,讓他們故意嘗試 “破壞” 腳本。

·如果腳本操作來自用戶或數據輸入文件的輸入數據,那么一定要全面篩選、檢查和檢驗輸入數據。操作數據列表的腳本應該可以處理多個不同的數據列表集。

·對于長時間運行的腳本,考慮在腳本中添加超時功能,以便在 n 分鐘之后終止或停止腳本:

stty –icannon min 0 time 1800

·在代碼中適當地進行縮進,增加代碼的可讀性。

對于用于特殊用途的腳本,可能希望添加交互式警告提示消息,從而向用戶說明腳本的用途。例如,清單 23 中的腳本獲取遠程日志并創建一個報告電子郵件。

清單 23. 獲取并報告日志的簡單 bash 腳本

#!/bin/bash

cd /data01/maillog

MAILSVRS=$(/bin/cat /data01/maillog/mail_servers)

DATELOG=`date "+%m%d%y"`

ALLMAILLOGS="/data01/maillog/all_svr_maillogs.$DATELOG"

MAILREPORT="/data01/maillog/all_svr_maillogs.report.$DATELOG"

MAILADDRESSES=$(/bin/cat /data01/maillog/addresses)

MAILADMINS="admin1@example.com, admin2@example.com"

MAILSTATSLOGALL="/data01/maillog/mailstats.log.all.$DATELOG"

DELDAYSLOGS=10

echo “Mail Report to $ MAILADMINS”

# 1 - Get some logs …

for svr in $MAILSVRS

do

if [ -e "/data01/maillog/$svr.maillog.$DATELOG.gz" ]; then

/bin/rm -f /data01/maillog/$svr.maillog.$DATELOG.gz

fi

done

# 2 - Combine all maillogs from all servers to onefile ($ALLMAILLOGS) ...

/bin/zcat server16.maillog.$DATELOG.gz server17.maillog.$DATELOG.gz

server18.maillog.$DATELOG.gz server19.maillog.$DATELOG.gz >>

$ALLMAILLOGS

# 3 - Run another script

/bin/cat $ALLMAILLOGS | /data01/maillog/mymailstats.pl | tee -a $MAILREPORT

# 4 - Get all of the mailstats logs to one log file to send by Email

/bin/cat /data01/maillog/mailstats.log.server*.$DATELOG > $MAILSTATSLOGALL

# Send the $MAILADMINS the mail reports

/bin/cat $MAILSTATSLOGALL | mail -s "ACME Servers Outbound Mail Servers

mailstats:$DATELOG" $MAILADMINS

#p#

bash 腳本編程中的變量、語法格式和結構

在 bash 中,可以通過幾種方法定義和設置變量。清單 24 中的腳本給出這些 shell 變量聲明方法的示例。

清單 24. 定義 bash 變量

$ cat a.sh

#!/bin/bash

A="String Value 1"

B='String Value 2'

C=9675

D=96.75

export E="String Value 3"

# if the variable $F is not ALREADY set to a value, assign "String Value 4" ...

F=${F:="String Value 4"}

echo "A=$A"

echo "B=$B"

echo "C=$C"

echo "D=$D"

echo "E=$E"

echo "F=$F"

exit 0

$ ./a.sh

A=String Value 1

B=String Value 2

C=9675

D=96.75

E=String Value 3

F=String Value 4

收集用戶輸入

要想收集用戶輸入,應該使用 read 語句并向用戶輸入分配一個變量,見 清單 25。

清單 25. 在 bash 腳本中獲取用戶輸入

$ cat prompt.sh

#!/bin/bash

echo "Please enter your first and last name:"

read ans

echo "Hellow $ans , welcome to bash scripting ...!"

exit 0

$ ./prompt.sh

Please enter your first and last name:

Joe Jackson

Hello Joe Jackson , welcome to bash scripting ...!

要想在 bash shell 腳本中使用函數,可以使用 清單 26 所示的方法。

清單 26. 在 bash 中實現函數

$ cat function.sh

#!/bin/bash

funcOne() {

echo "Running function 1, with parameter $1"

date

echo "Current listing /tmp directory, last 3 lines"

ls -lrt /tmp | tail -3

}

echo "Hello World"

funcOne "Server01"

exit 0

$ ./function.sh

Hello World

Running function 1, with parameter Server01

Sun Aug 22 22:43:04 UTC 2010

Current listing /tmp directory, last 3 lines

-rw-r- 1 dsmith progdevel 12749743 Aug 16 20:32 files.tar.gz

drwxr-xr-x 2 jjones progdevel 4096 Aug 16 20:42 ff_hosting_files

-rw-r- 1 rhill heng 1440 Aug 22 19:07 myscript.log

也可以像 清單 27 這樣編寫函數。

清單 27. bash 中的另一種函數定義

#!/bin/bash

function funcTwo () {

echo "Running function 2, with parameter $1"

date

echo "Current listing /var directory, last 3 lines"

ls -lrt /var | tail -3

}

funcTwo "Server02"

exit 0

$ ./function.sh

Running function 2, with parameter Server02

Sun Aug 22 22:53:16 UTC 2010

Current listing /var directory, last 3 lines

drwxrwxrwt 3 root root 4096 Aug 6 18:22 tmp

drwxr-xr-x 6 root root 4096 Aug 22 04:02 log

drwxrwxr-x 4 root lock 4096 Aug 22 04:22 lock

function 關鍵詞是可選的。惟一的規則是必須先定義函數,然后才能在程序中使用它。調用函數的方法是調用它的名稱并傳遞必需的或可選的輸入參數。#p#

循環和決策

假設您需要在幾個服務器上執行某些重復的工作。在 bash 中,可以使用 for 循環輕松地實現這個目標。清單 28 給出代碼。

清單 28. 簡單 for 循環的 bash 腳本編程示例

$SERVERS=”server01 server02 server03 server04 server05”

for i in $SERVERS

do

echo "Removing file from server: $i"

ssh $i rm -f /tmp/junk1.txt

done

bash 中的 while 循環可以重復執行語句一定的次數,或者一直執行到滿足某一條件為止。清單 29 給出一個示例。

清單 29. 簡單的 while 循環

LOOPCTR=1

while [ $LOOPCTR -lt 6 ]

do

echo “Running patch script for server0$LOOPCTR”

/data/patch.sh server0$LOOPCTR

LOOPCTR=`expr $LOOPCTR + 1`

done

bash 中的 case 語句可以用來測試多個條件或值并相應地執行操作。有時候,使用這種語句比嵌套的 for 循環或 if 語句更好,可以減少重復的代碼而且結構更清楚。清單 30 給出一個簡短的 case 語句,它根據變量 $key 的值調用函數。

清單 30. bash 中的 case 語句示例

case $key in

q) logit "Quit";

exit;;

1) echo “\tChecking Mail Servers”;

check_mail_servers;;

2) echo "\tChecking Web Servers";

check_web_servers;;

3) echo “\tChecking App Servers;

check_app_servers;;

4) echo “\tChecking Database Servers”;

check_database_servers;;

b) echo "Go Back to Main menu";

MENUFLAG="main";

main_menu;;

*) echo "$key invalid choice";

invalid;;

esac

#p#

bash 腳本編程的優缺點

需要快速地完成某些任務嗎?如果您掌握了 bash,就可以非常輕松地編寫***的 web 組件,可以大大減少所需的時間。bash 腳本編程不是編程語言或應用程序。不需要編譯器,也不需要特殊的庫或軟件開發環境。但是,bash shell 腳本的行為與應用程序相似,甚至能夠執行應用程序可以完成的一些任務和工作。

從好的方面來說:

bash 提供快速開發,代碼便于修改。bash 腳本編程的基本方法幾乎不隨時間變動。

一些編程語言的代碼規則或語法的變動可能比較頻繁,與它們相比,bash 的語法相當簡單明了。

高級 bash 特性向用戶提供比以前更強的能力(例如,紀元、函數、信號控制、多個擴展、命令歷史、使用一維數組的方法)。

進行 bash shell 腳本編程只需要 *nix bash shell。

從壞的方面來說,bash 代碼:

由 shell 執行,然后傳遞給內核,這個過程通常比編譯為純機器碼的二進制程序慢。因此,bash shell 腳本編程可能不適用于某些應用程序設計或功能。

是明文的,具有讀權限的任何人都可以輕松地讀取它們,而編譯的二進制代碼是不可讀的。在對敏感數據進行編碼時,使用明文是很嚴重的安全風險。

沒有特定的標準函數集,而許多現代編程語言有內置的函數,可以滿足各種編程需求。

結束語

既然掌握了 bash shell 腳本編程的基礎,就必須善用這種能力。應該用您剛掌握的 crontab、簡單命令和交互式菜單全力維護 *nix 系統。不要畏懼成為 “bash” 管理員!

原文鏈接:http://www.ibm.com/developerworks/cn/aix/library/au-getstartedbash/index.html?ca=drs-

【編輯推薦】

  1. 用戶行為監控:bash history logging攻防
  2. Linux下的實用bash命令分享
  3. PowerShell與SSH/bash的對比點評
責任編輯:黃丹 來源: IBMDW
相關推薦

2018-08-15 14:00:18

LinuxBash系統管理員

2010-05-05 15:56:37

Unix系統

2018-08-03 09:40:46

Linux系統管理員經驗

2011-11-17 16:06:45

IT系統管理

2011-09-01 13:42:15

優化布線系統管理布線系統

2010-05-05 16:27:22

Unix系統

2010-05-04 15:22:25

Unix系統

2013-05-02 14:06:30

Android開發用戶系統管理

2017-03-27 09:30:14

Linux系統管理技巧

2013-05-09 09:27:46

2010-12-24 14:46:31

Perl腳本

2012-07-31 14:57:14

NetGain EM

2012-02-29 00:57:41

Linux系統

2010-01-14 17:05:42

MySQL CentO

2009-07-11 16:04:04

布線系統管理優化

2011-10-09 13:55:40

2019-03-15 15:47:43

Linux系統管理員編程技能

2011-04-02 10:13:36

Linux系統管理

2009-09-16 13:09:04

業務系統管理

2010-05-07 16:47:56

Unix系統
點贊
收藏

51CTO技術棧公眾號

一级黄色片播放| 欧美精品福利在线| 99re精彩视频| 18加网站在线| 91麻豆免费看片| 国产精品永久在线| 亚洲精品在线观看av| 香蕉久久夜色精品国产使用方法 | 91网上在线视频| 国产精品久久视频| 久久午夜无码鲁丝片| 精品成av人一区二区三区| 欧美一级xxx| 国产a级片免费观看| 亚洲wwwww| 国产精品私人自拍| 国产综合av一区二区三区| 伊人免费在线观看| 亚洲深夜激情| 久久91亚洲精品中文字幕奶水| 国产激情在线免费观看| 日本精品一区二区三区在线观看视频| 色诱视频网站一区| www.射射射| 在线āv视频| 中文字幕欧美日韩一区| 精品综合在线| 亚洲乱码在线观看| 久久99蜜桃精品| 国产精品99久久久久久久久久久久 | 综合网中文字幕| 狠狠人妻久久久久久综合蜜桃| 久久综合给合| 制服丝袜亚洲播放| 91福利国产成人精品播放| www.精品| 欧美视频在线免费看| 97视频在线免费| 青春草免费在线视频| 亚洲欧洲三级电影| 一区二区日本伦理| 9i精品一二三区| 国产日产亚洲精品系列| 欧美成人第一区| 午夜在线视频免费| 97久久超碰精品国产| 国产精品视频免费一区二区三区| 国产视频在线免费观看| 久久精品国产99国产| 国产精品视频久久| 中文字幕av网站| 美女爽到高潮91| 国产美女被下药99| 亚洲一区二区激情| 精品一二三四区| 国产在线a不卡| 国产一区二区自拍视频| 黄色资源网久久资源365| 国产免费一区二区三区香蕉精| 在线永久看片免费的视频| 久久精品毛片| 国产精品电影久久久久电影网| 国产一区免费看| 日韩电影网1区2区| 国产情人节一区| 国产乱码久久久| 国产精品123区| 国精产品一区二区| 三级视频在线| 欧美国产一区在线| 一区二区成人国产精品| a免费在线观看| 亚洲第一激情av| 超碰97人人射妻| 日韩色淫视频| 日韩你懂的电影在线观看| 成人做爰www看视频软件| 免费日韩一区二区三区| 亚洲一区www| 在线观看天堂av| 欧美激情精品久久久六区热门| 久久久久久久久久久免费 | 欧美黄色一级网站| 亚洲精选91| 国产精品久久久久久久7电影| 国产影视一区二区| 国产99久久久国产精品潘金| 久久久精彩视频| 91官网在线| 亚洲综合在线免费观看| 日本精品www| 综合久久av| 精品视频中文字幕| 亚洲精品卡一卡二| 国产精品毛片一区二区三区| 国产精品爽爽爽| 欧美一级免费片| 欧美国产禁国产网站cc| 免费人成自慰网站| 巨胸喷奶水www久久久免费动漫| 日韩免费在线观看| 国产精品20p| 国产一区观看| 国产精品视频自在线| 亚洲国产精品成人久久蜜臀| 国产日本一区二区| 国产免费裸体视频| 国产欧美在线观看免费| 日韩精品视频免费| 午夜少妇久久久久久久久| 老司机精品福利视频| 不卡视频一区二区| 欧美另类极品| 色综合久久中文综合久久97| 原创真实夫妻啪啪av| 精品久久久久久久| 欧美在线视频播放| 亚洲精选一区二区三区| 亚洲欧洲精品天堂一级| aaa毛片在线观看| 好吊妞国产欧美日韩免费观看网站| 中文字幕久久久| 久久青青草原亚洲av无码麻豆| 国产成人亚洲精品青草天美| 亚洲欧洲在线一区| 先锋欧美三级| 亚洲毛片在线观看| 国产福利拍拍拍| 国产风韵犹存在线视精品| 亚洲免费视频一区| 91tv亚洲精品香蕉国产一区| 亚洲男人天堂2019| 欧美一区二区激情视频| 成人成人成人在线视频| 大地资源网在线观看免费官网| 日韩制服一区| 在线播放精品一区二区三区 | 中日韩脚交footjobhd| 精品嫩草影院久久| 天天综合天天做| 另类的小说在线视频另类成人小视频在线 | 亚洲综合色区另类av| 亚洲高清视频免费| 希岛爱理av一区二区三区| 国产精品午夜视频| av在线免费观看网| 欧美少妇一区二区| 综合 欧美 亚洲日本| 日本不卡一区二区三区| 日韩精品大片| 国产69精品久久| 日韩中文有码在线视频| 国产乱人乱偷精品视频a人人澡| 国产精品三级视频| 成人不卡免费视频| 91精品久久久久久久久久不卡| 成人写真视频福利网| 黄色视屏免费在线观看| 日韩一区二区在线看| 九九热精彩视频| 成人免费三级在线| 九九九九免费视频| 精品国产乱码久久久| 国产欧美一区二区三区在线| 精品176二区| 精品国产伦一区二区三区免费| 久一区二区三区| 不卡一区二区在线| 欧美日韩在线不卡视频| 日韩精品免费| 2022国产精品| 新版的欧美在线视频| 亚洲欧美激情在线视频| 中文字幕日韩国产| 亚洲色图视频免费播放| 精人妻一区二区三区| 国产欧美二区| 亚洲欧洲精品一区| 6080成人| 国产91精品网站| 国产美女av在线| 精品盗摄一区二区三区| 中文字幕永久在线| 亚洲欧美激情视频在线观看一区二区三区 | av成人免费在线| 亚洲人成色77777| 亚洲激情五月| 久久久福利视频| 国产精品色婷婷在线观看| 久久久久国产精品www| 黄色小视频在线观看| 欧美一区二区在线播放| 成人精品免费在线观看| 国产精品天美传媒沈樵| 亚洲av成人片无码| 蜜桃在线一区二区三区| 亚洲精品蜜桃久久久久久| 国产一区二区三区站长工具| 亚洲最大的免费| 免费观看成人性生生活片| 色综合视频一区中文字幕| 国内av一区二区三区| 精品久久国产97色综合| 黄色大全在线观看| 香蕉加勒比综合久久| 欧美日韩国产黄色| 成人免费视频视频在线观看免费| 噼里啪啦国语在线观看免费版高清版| 亚洲最新av| 日韩理论片在线观看| 国产伦乱精品| 91人成网站www| 国产一区二区三区朝在线观看| 久久久久中文字幕| 高h视频在线观看| 中文字幕不卡在线视频极品| 欧美 日韩 国产 成人 在线 91| 欧美日韩亚洲综合在线| 亚洲欧美精品一区二区三区| 亚洲五月六月丁香激情| 尤物在线免费视频| 国产精品视频一二| 91网站免费视频| 99久久精品免费| 无码人妻丰满熟妇区毛片蜜桃精品| 奇米在线7777在线精品| 日韩a在线播放| 国产日韩免费| 毛片在线播放视频| 韩日成人av| 白白操在线视频| 中文精品久久| 91嫩草国产丨精品入口麻豆| 天天做天天爱天天爽综合网| 日本视频精品一区| 夜色77av精品影院| 欧美大陆一区二区| 日韩aaa久久蜜桃av| 国产欧美日韩伦理| 都市激情亚洲欧美| 97在线电影| 成人搞黄视频| 国产在线欧美日韩| 精品按摩偷拍| 精品视频第一区| 日韩理论电影中文字幕| 久久精品国产99精品国产亚洲性色| 第一区第二区在线| 激情视频在线观看一区二区三区| youjizzjizz亚洲| 国产一区二区三区四区五区加勒比 | 免费观看成人鲁鲁鲁鲁鲁视频| 日本在线观看a| 三级亚洲高清视频| www.日本一区| 极品美女销魂一区二区三区免费 | 精品欧美视频| 99re在线观看| 狼人精品一区二区三区在线| 久久精品日韩精品| 国产亚洲精品美女久久久久久久久久| 欧美在线日韩精品| 色777狠狠狠综合伊人| 国产又黄又爽免费视频| 欧美国产高清| 黄色av网址在线播放| 久久一区二区三区四区五区 | 岛国大片在线播放| 国产精品一国产精品k频道56| 欧美牲交a欧美牲交aⅴ免费真| 蜜桃一区二区三区四区| 又黄又爽又色的视频| 成人免费毛片片v| 六月婷婷七月丁香| 国产精品久久久久久久久久免费看 | 少妇搡bbbb搡bbb搡打电话| 99re热这里只有精品视频| 爱爱免费小视频| 国产精品传媒入口麻豆| 久久久久成人网站| 色综合一个色综合亚洲| 国产日韩精品suv| 亚洲精品99久久久久中文字幕| 国产精品久久久久一区二区国产| 成人婷婷网色偷偷亚洲男人的天堂| 99re热精品| 蜜桃精品wwwmitaows| 美国av在线播放| 中国女人久久久| 奇米视频7777| 99免费精品在线| 秋霞欧美一区二区三区视频免费| 一区二区三区日韩精品| 久久亚洲精品石原莉奈| 欧美一级二级三级蜜桃| 日韩一区av| 久久6精品影院| 亚洲四虎影院| 国产精选一区二区| 99久久久久国产精品| 女人天堂av手机在线| 久久av老司机精品网站导航| 成年人的黄色片| 国产精品久久久久一区| 九九热在线视频播放| 欧美精品在线观看播放| 亚洲欧美综合在线观看| 久久国产精品网站| 色天使综合视频| 国产乱码一区| 性欧美69xoxoxoxo| 麻豆av免费在线| 成人午夜电影小说| 成人高潮免费视频| 91福利小视频| 午夜视频免费在线| 欧美成人免费在线观看| 69堂精品视频在线播放| 国产精品一区而去| 亚洲精品91| 91欧美视频在线| 久久久久亚洲蜜桃| 91看片在线播放| 精品欧美一区二区久久| 精品视频在线一区二区| 国产精品综合网站| 欧美精品尤物在线观看| 国产特级黄色大片| 成人动漫一区二区| 久久久精品国产sm调教网站| 91精品国产全国免费观看| 北岛玲日韩精品一区二区三区| 欧美性受xxx| 欧美aaaaa级| 五十路熟女丰满大屁股| 粉嫩嫩av羞羞动漫久久久| 69xx绿帽三人行| 欧美一区二区三区播放老司机| 中文字幕在线免费| 国产精品直播网红| av一区二区在线播放| 日本成人中文字幕在线| 久久久99精品免费观看不卡| aaa在线视频| 亚洲色图在线观看| 亚洲一区二区三区四区| 日韩精品国内| 美女视频一区二区三区| 91ts人妖另类精品系列| 91精品啪在线观看国产60岁| 黄色成人影院| 国产精品国色综合久久| 极品av少妇一区二区| 在线观看国产免费视频 | 丰满少妇xoxoxo视频| 亚洲欧美国产另类| 456成人影院在线观看| 深夜福利成人| 国内不卡的二区三区中文字幕 | 精品福利一区二区| 欧美777四色影视在线| 国产精品av在线播放| 久久一区二区三区电影| 一起草最新网址| 午夜精品久久久久久久久| 牛牛热在线视频| 国产精品丝袜一区二区三区| 国产精品二区不卡| 国产大尺度视频| 国产情侣av在线| 午夜精品爽啪视频| 欧美精品少妇| 国产精品视频1区| 亚欧美无遮挡hd高清在线视频| 久久人人爽人人片| 午夜久久久影院| 国产精品久久久久一区二区国产| 国产一区二区在线免费| 欧美激情综合色综合啪啪| 国产人妻黑人一区二区三区| 日本久久二区| 色爱区成人综合网| 韩国三级电影一区二区| 国产精久久久久久| 亚洲无限av看| 婷婷视频一区二区三区| 狠狠97人人婷婷五月| 国产精品人人做人人爽人人添| 精品久久久免费视频| 55夜色66夜色国产精品视频 | 精品国产免费人成在线观看| 电影一区二区三区| 青青草免费在线视频观看| 国产自产高清不卡| 中文字幕视频网站| 欧美精品免费看| 久久99蜜桃| 男女性杂交内射妇女bbwxz| 欧美日韩一级片网站| 99thz桃花论族在线播放|