璁稿浜虹敤shell鑴氭湰瀹屾垚涓浜涚畝鍗曚換鍔★紝鑰屼笖鍙樻垚浜?jiǎn)浠栦滑鐢熷懡鐨勪竴閮ㄥ垎銆備笉騫哥殑鏄紝shell鑴氭湰鍦ㄨ繍琛屽紓甯告椂浼?xì)鍙楀埌闈炲父澶х殑濯?jiǎng)鍝嶃傚湪鍐欒剼鏈椂灝嗚繖綾婚棶棰樻渶灝忓寲鏄崄鍒嗗繀瑕佺殑銆傛湰鏂囦腑鎴戝皢浠嬬粛涓浜涜bash鑴氭湰鍙樺緱鍋ュ.鐨勬妧鏈?/p>
浣犲洜涓烘病鏈夊鍙橀噺鍒濆鍖栬屼嬌鑴氭湰宕╂簝榪囧灝戞錛熷浜庢垜鏉ヨ錛屽緢澶氭銆?/p>
chroot=$1 ... rm -rf $chroot/usr/share/doc
濡傛灉涓婇潰鐨勪唬鐮佷綘娌℃湁緇欏弬鏁板氨榪愯錛屼綘涓嶄細(xì)浠呬粎鍒犻櫎鎺塩hroot涓殑鏂囨。錛岃屾槸灝嗙郴緇熺殑鎵鏈夋枃妗i兘鍒犻櫎銆傞偅浣犲簲璇ュ仛浜涗粈涔堝憿錛熷ソ鍦╞ash鎻愪緵浜?em>set -u錛屽綋浣犱嬌鐢ㄦ湭鍒濆鍖栫殑鍙橀噺鏃訛紝璁゜ash鑷姩閫鍑恒備綘涔熷彲浠ヤ嬌鐢ㄥ彲璇繪ф洿寮轟竴鐐圭殑set -o nounset銆?/p>
david% bash /tmp/shrink-chroot.sh
$chroot=
david% bash -u /tmp/shrink-chroot.sh
/tmp/shrink-chroot.sh: line 3: $1: unbound variable
david%
浣犲啓鐨勬瘡涓涓剼鏈殑寮濮嬮兘搴旇鍖呭惈set -e銆傝繖鍛婅瘔bash涓浣嗘湁浠諱綍涓涓鍙ヨ繑鍥為潪鐪熺殑鍊鹼紝鍒欓鍑篵ash銆備嬌鐢?e鐨勫ソ澶勬槸閬垮厤閿欒婊氶洩鐞冭埇鐨勫彉鎴愪弗閲嶉敊璇紝鑳藉敖鏃╃殑鎹曡幏閿欒銆傛洿鍔犲彲璇葷殑鐗堟湰錛?em>set -o errexit
浣跨敤-e鎶婁綘浠庢鏌ラ敊璇腑瑙f斁鍑烘潵銆傚鏋滀綘蹇樿浜?jiǎn)妫鏌ワ紝bash浼?xì)鏇夸綘鍋殬q欎歡浜嬨備笉榪囦綘涔熸病鏈夊姙娉曚嬌鐢?em>$?鏉ヨ幏鍙栧懡浠ゆ墽琛岀姸鎬佷簡(jiǎn)錛屽洜涓篵ash鏃犳硶鑾峰緱浠諱綍闈?鐨勮繑鍥炲箋備綘鍙互浣跨敤鍙︿竴縐嶇粨鏋勶細(xì)
command
if [ "$?"-ne 0]; then echo "command failed"; exit 1; fi
鍙互鏇挎崲鎴愶細(xì)
command || { echo "command failed"; exit 1; }
鎴栬呬嬌鐢細(xì)
if ! command; then echo "command failed"; exit 1; fi
濡傛灉浣犲繀欏諱嬌鐢ㄨ繑鍥為潪0鍊肩殑鍛戒護(hù)錛屾垨鑰呬綘瀵硅繑鍥炲煎茍涓嶆劅鍏磋叮鍛紵浣犲彲浠ヤ嬌鐢?command || true 錛屾垨鑰呬綘鏈変竴孌靛緢闀跨殑浠g爜錛屼綘鍙互鏆傛椂鍏抽棴閿欒媯(gè)鏌ュ姛鑳斤紝涓嶈繃鎴戝緩璁綘璋ㄦ厧浣跨敤銆?/p>
set +e
command1
command2
set -e
鐩稿叧鏂囨。鎸囧嚭錛宐ash榛樿榪斿洖綆¢亾涓渶鍚庝竴涓懡浠ょ殑鍊鹼紝涔熻鏄綘涓嶆兂瑕佺殑閭d釜銆傛瘮濡傛墽琛?false | true 灝嗕細(xì)琚涓哄懡浠ゆ垚鍔熸墽琛屻傚鏋滀綘鎯寵榪欐牱鐨勫懡浠よ璁や負(fù)鏄墽琛屽け璐ワ紝鍙互浣跨敤 set -o pipefail
浣犵殑鑴氭湰涔熻浼?xì)琚攽謭?#8220;鎰忓”鐨勮處鎴蜂笅榪愯錛屽儚緙哄皯鏂囦歡鎴栬呯洰褰曟病鏈夎鍒涘緩絳夋儏鍐點(diǎn)備綘鍙互鍋氫竴浜涢闃茶繖浜涢敊璇簨鎯呫傛瘮濡傦紝褰撲綘鍒涘緩涓涓洰褰曞悗錛屽鏋滅埗鐩綍涓嶅瓨鍦紝mkdir 鍛戒護(hù)浼?xì)杩斿洖涓涓敊璇傚鏋滀綘鍒涘緩鐩綍鏃剁粰mkdir鍛戒護(hù)鍔犱笂-p閫夐」錛屽畠浼?xì)鍦ㄥ垱寰忛渶瑕佺殑鐩綍鍓嶏紝鎶婇渶瑕佺殑鐖剁洰褰曞垱寤哄嚭鏉ャ傚彟涓涓緥瀛愭槸 rm 鍛戒護(hù)銆傚鏋滀綘瑕佸垹闄や竴涓笉瀛樺湪鐨勬枃浠訛紝瀹冧細(xì)“鍚愭Ы”騫朵笖浣犵殑鑴氭湰浼?xì)鍋滄宸ヤ綔銆傦紙鍥犱負(fù)浣犱嬌鐢ㄤ簡(jiǎn)-e閫夐」錛屽鍚э紵錛変綘鍙互浣跨敤-f閫夐」鏉ヨВ鍐寵繖涓棶棰橈紝鍦ㄦ枃浠朵笉瀛樺湪鐨勬椂鍊欒鑴氭湰緇х畫(huà)宸ヤ綔銆?nbsp;
鏈変簺浜轟粠鍦ㄦ枃浠跺悕鎴栬呭懡浠よ鍙傛暟涓嬌鐢ㄧ┖鏍鹼紝浣犻渶瑕佸湪緙栧啓鑴氭湰鏃舵椂鍒昏寰楄繖浠朵簨銆備綘闇瑕佹椂鍒昏寰楃敤寮曞彿鍖呭洿鍙橀噺銆?/p>
if [ $filename = "foo" ];
褰?em>$filename鍙橀噺鍖呭惈絀烘牸鏃跺氨浼?xì)鎸傛帀銆傚彲浠ヨ繖鏍瘋В鍐籌細(xì)
if [ "$filename" = "foo" ];
浣跨敤$@鍙橀噺鏃訛紝浣犱篃闇瑕佷嬌鐢ㄥ紩鍙鳳紝鍥犱負(fù)絀烘牸闅斿紑鐨勪袱涓弬鏁頒細(xì)琚В閲婃垚涓や釜鐙珛鐨勯儴鍒嗐?/p>
david% foo() { for i in $@; do echo $i; done }; foo bar "baz quux"
bar
baz
quux
david% foo() { for i in "$@"; do echo $i; done }; foo bar "baz quux"
bar
baz quux
鎴戞病鏈夋兂鍒頒換浣曚笉鑳戒嬌鐢?em>"$@"鐨勬椂鍊欙紝鎵浠ュ綋浣犳湁鐤戦棶鐨勬椂鍊欙紝浣跨敤寮曞彿灝辨病鏈夐敊璇?/p>
濡傛灉浣犲悓鏃朵嬌鐢╢ind鍜寈args錛屼綘搴旇浣跨敤 -print0 鏉ヨ瀛楃鍒嗗壊鏂囦歡鍚嶏紝鑰屼笉鏄崲琛岀鍒嗗壊銆?/p>
david% touch "foo bar"
david% find | xargs ls
ls: ./foo: No such file or directory
ls: bar: No such file or directory
david% find -print0 | xargs -0 ls
./foo bar
褰撲綘緙栧啓鐨勮剼鏈寕鎺夊悗錛屾枃浠剁郴緇熷浜庢湭鐭ョ姸鎬併傛瘮濡傞攣鏂囦歡鐘舵併佷復(fù)鏃舵枃浠剁姸鎬佹垨鑰呮洿鏂頒簡(jiǎn)涓涓枃浠跺悗鍦ㄦ洿鏂頒笅涓涓枃浠跺墠鎸傛帀銆傚鏋滀綘鑳借В鍐寵繖浜涢棶棰橈紝 鏃犺鏄? 鍒犻櫎閿佹枃浠訛紝鍙堟垨鑰呭湪鑴氭湰閬囧埌闂鏃跺洖婊氬埌宸茬煡鐘舵侊紝浣犻兘鏄潪甯告鐨勩傚垢榪愮殑鏄紝bash鎻愪緵浜?jiǎn)涓縐嶆柟娉曪紝褰揵ash鎺ユ敹鍒頒竴涓猆NIX淇″彿鏃訛紝榪愯涓涓? 鍛戒護(hù)鎴栬呬竴涓嚱鏁般傚彲浠ヤ嬌鐢?strong>trap鍛戒護(hù)銆?/p>
trap command signal [signal ...]
浣犲彲浠ラ摼鎺ュ涓俊鍙鳳紙鍒楄〃鍙互浣跨敤kill -l鑾峰緱錛夛紝浣嗘槸涓轟簡(jiǎn)娓呯悊孌嬪眬錛屾垜浠彧浣跨敤鍏朵腑鐨勪笁涓細(xì)INT錛?em>TERM鍜?em>EXIT銆備綘鍙互浣跨敤-as鏉ヨtraps鎭㈠鍒板垵濮嬬姸鎬併?/p>
INT | Interrupt - 褰撴湁浜轟嬌鐢–trl-C緇堟鑴氭湰鏃惰瑙﹀彂 |
TERM | Terminate - 褰撴湁浜轟嬌鐢╧ill鏉姝昏剼鏈繘紼嬫椂琚Е鍙?/p> |
EXIT | Exit - 榪欐槸涓涓吉淇″彿錛屽綋鑴氭湰姝e父閫鍑烘垨鑰卻et -e鍚庡洜涓哄嚭閿欒岄鍑烘椂琚Е鍙?/p> |
褰撲綘浣跨敤閿佹枃浠舵椂錛屽彲浠ヨ繖鏍峰啓錛?/p>
if [ ! -e $lockfile ]; then
touch $lockfile
critical-section
rm $lockfile
else
echo "critical-section is already running"
fi
褰撴渶閲嶈鐨勯儴鍒?critical-section)姝e湪榪愯鏃訛紝濡傛灉鏉姝諱簡(jiǎn)鑴氭湰榪涚▼錛屼細(xì)鍙戠敓浠涔堝憿錛熼攣鏂囦歡浼?xì)琚墧鍦ㄩ偅锛岃屼笖浣犵殑鑴氭湰鍦ㄥ畠琚垹闄や互鍓嶅啀涔熶笉浼?xì)杩愯浜?jiǎn)銆傝В鍐蟲(chóng)柟娉曪細(xì)
if [ ! -e $lockfile ]; then
trap " rm -f $lockfile; exit" INT TERM EXIT
touch $lockfile
critical-section
rm $lockfile
trap - INT TERM EXIT
else
echo "critical-section is already running"
fi
鐜板湪褰撲綘鏉姝昏繘紼嬫椂錛岄攣鏂囦歡涓鍚岃鍒犻櫎銆傛敞鎰忓湪trap鍛戒護(hù)涓槑紜湴閫鍑轟簡(jiǎn)鑴氭湰錛屽惁鍒欒剼鏈細(xì)緇х畫(huà)鎵цtrap鍚庨潰鐨勫懡浠ゃ?/p>
鍦ㄤ笂闈㈤攣鏂囦歡鐨勪緥瀛愪腑錛屾湁涓涓珶鎬佹潯浠舵槸涓嶅緱涓嶆寚鍑虹殑錛屽畠瀛樺湪浜庡垽鏂攣鏂囦歡鍜屽垱寤洪攣鏂囦歡涔嬮棿銆備竴涓彲琛岀殑瑙e喅鏂規(guī)硶鏄嬌鐢↖O閲嶅畾鍚戝拰bash鐨刵oclobber(wikipedia)妯″紡錛岄噸瀹氬悜鍒頒笉瀛樺湪鐨勬枃浠躲傛垜浠彲浠ヨ繖涔堝仛錛?/p>
if ( set -o noclobber; echo "$$" > "$lockfile") 2> /dev/null;
then
trap 'rm -f "$lockfile"; exit $?' INT TERM EXIT
critical-section
rm -f "$lockfile"
trap - INT TERM EXIT
else
echo "Failed to acquire lockfile: $lockfile"
echo "held by $(cat $lockfile)"
fi
鏇村鏉備竴鐐瑰効鐨勯棶棰樻槸浣犺鏇存柊涓澶у爢鏂囦歡錛屽綋瀹冧滑鏇存柊榪囩▼涓嚭鐜伴棶棰樻椂錛屼綘鏄惁鑳借鑴氭湰鎸傚緱鏇村姞浼橀泤涓浜涖備綘鎯崇‘璁ら偅浜涙紜洿鏂頒簡(jiǎn)錛屽摢浜涙牴鏈病鏈夊彉鍖栥傛瘮濡備綘闇瑕佷竴涓坊鍔犵敤鎴風(fēng)殑鑴氭湰銆?/p>
add_to_passwd $user
cp -a /etc/skel /home/$user
chown $user /home/$user -R
褰撶鐩樼┖闂翠笉瓚蟲(chóng)垨鑰呰繘紼嬩腑閫旇鏉姝伙紝榪欎釜鑴氭湰灝變細(xì)鍑虹幇闂銆傚湪榪欑鎯呭喌涓嬶紝浣犱篃璁稿笇鏈涚敤鎴瘋處鎴蜂笉瀛樺湪錛岃屼笖浠栫殑鏂囦歡涔熷簲璇ヨ鍒犻櫎銆?/p>
rollback() {
del_from_passwd $user
if [ -e /home/$user ]; then
rm -rf /home/$user
fi
exit
}
trap rollback INT TERM EXIT
add_to_passwd $user
cp -a /etc/skel /home/$user
chown $user /home/$user -R
trap - INT TERM EXIT
鍦ㄨ剼鏈渶鍚庨渶瑕佷嬌鐢╰rap鍏抽棴rollback璋冪敤錛屽惁鍒欏綋鑴氭湰姝e父閫鍑虹殑鏃跺檙ollback灝嗕細(xì)琚皟鐢紝閭d箞鑴氭湰絳変簬浠涔堥兘娌″仛銆?/p>
鍙堟槸浣犻渶瑕佷竴嬈℃洿鏂扮洰褰曚腑鐨勪竴澶у爢鏂囦歡錛屾瘮濡備綘闇瑕佸皢URL閲嶅啓鍒板彟涓涓綉绔欑殑鍩熷悕銆備綘涔熻浼?xì)鍐欏Q?/p>
for file in $(find /var/www -type f -name "*.html"); do
perl -pi -e 's/www.example.net/www.example.com/' $file
done
濡傛灉淇敼鍒頒竴鍗婃槸鑴氭湰鍑虹幇闂錛屼竴閮ㄥ垎浣跨敤www.example.com錛岃屽彟涓閮ㄥ垎浣跨敤www.example.net銆備綘鍙互浣跨敤澶囦喚鍜宼rap瑙e喅錛屼絾鍦ㄥ崌綰ц繃紼嬩腑浣犵殑緗戠珯URL鏄笉涓鑷寸殑銆?/p>
瑙e喅鏂規(guī)硶鏄皢榪欎釜鏀瑰彉鍋氭垚涓涓師瀛愭搷浣溿傚厛瀵規(guī)暟鎹仛涓涓壇鏈紝鍦ㄥ壇鏈腑鏇存柊URL錛屽啀鐢ㄥ壇鏈浛鎹㈡帀鐜板湪宸ヤ綔鐨勭増鏈備綘闇瑕佺‘璁ゅ壇鏈拰宸ヤ綔鐗堟湰鐩綍鍦ㄥ悓涓涓鐩樺垎鍖轟笂錛岃繖鏍蜂綘灝卞彲浠ュ埄鐢↙inux緋葷粺鐨勪紭鍔匡紝瀹冪Щ鍔ㄧ洰褰曚粎浠呮槸鏇存柊鐩綍鎸囧悜鐨刬node鑺傜偣銆?/p>
cp -a /var/www /var/www-tmp
for file in $(find /var/www-tmp -type -f -name "*.html"); do
perl -pi -e 's/www.example.net/www.example.com/' $file
done
mv /var/www /var/www-old
mv /var/www-tmp /var/www
榪欐剰鍛崇潃濡傛灉鏇存柊榪囩▼鍑洪棶棰橈紝綰夸笂緋葷粺涓嶄細(xì)鍙楀獎(jiǎng)鍝嶃傜嚎涓婄郴緇熷彈褰卞搷鐨勬椂闂撮檷浣庝負(fù)涓ゆmv鎿嶄綔鐨勬椂闂達(dá)紝榪欎釜鏃墮棿闈炲父鐭紝鍥犱負(fù)鏂囦歡緋葷粺浠呮洿鏂癷node鑰屼笉鐢ㄧ湡姝g殑澶嶅埗鎵鏈夌殑鏁版嵁銆?/p>
榪欑鎶鏈殑緙虹偣鏄綘闇瑕佷袱鍊嶇殑紓佺洏絀洪棿錛岃屼笖閭d簺闀挎椂闂存墦寮鏂囦歡鐨勮繘紼嬮渶瑕佹瘮杈冮暱鐨勬椂闂存墠鑳藉崌綰у埌鏂版枃浠剁増鏈紝寤鴻鏇存柊瀹屾垚鍚庨噸鏂板惎鍔ㄨ繖浜涜繘紼嬨傚 浜? apache鏈嶅姟鍣ㄦ潵璇磋繖涓嶆槸闂錛屽洜涓哄畠姣忔閮介噸鏂版墦寮鏂囦歡銆備綘鍙互浣跨敤lsof鍛戒護(hù)鏌ョ湅褰撳墠姝f墦寮鐨勬枃浠躲備紭鍔挎槸浣犳湁浜?jiǎn)涓涓厛鍓嶇殑澶囦喚錛屽綋浣犻渶瑕佽繕鍘? 鏃訛紝瀹冨氨媧句笂鐢ㄥ満浜?jiǎn)銆?/p>杞嚜: http://www.linuxidc.com/Linux/2012-03/56614.htm