Linux Shell腳本攻略 讀書(shū)筆記
Linux Shell腳本攻略 讀書(shū)筆記
這是一本小書(shū),總共253頁(yè),但內(nèi)容卻很豐富,書(shū)中的示例小巧而實(shí)用,對(duì)我這樣總是在shell門(mén)前徘徊的人來(lái)說(shuō)真是如獲至寶;
最有價(jià)值的當(dāng)屬文本處理,對(duì)這塊我單獨(dú)整理出來(lái)一篇blog,詳見(jiàn)
《Linux Shell文本處理工具集錦》
下面是文本處理之外的簡(jiǎn)單介紹,如果你覺(jué)得自己的shell需要充充電,強(qiáng)烈建議讀讀這本
《linux Shell腳本攻略》
。
嗨,Echo一下
從 echo開(kāi)始:
帶引號(hào)的 echo和不帶引號(hào)的 echo區(qū)別:
使用帶引號(hào)時(shí),bash 不會(huì)對(duì)單引號(hào)中的變量進(jìn)行求值,而是原樣輸出;
而使用雙引號(hào),或者不使用引號(hào),則會(huì)對(duì)變量進(jìn)行解析:
echo '$var' // $var
echo $var // 5
echo "$var" // 5
-
對(duì)比printf 的格式化輸出
printf "%-5s %-10s %-4s" NO NAME HELLO //左對(duì)齊 寬度為 5 10 4
具體的值使用右邊引號(hào)外的; -
對(duì)比 python中的輸出:
printf " %s " % "hello" -
讓echo支持轉(zhuǎn)義字符:-e
[/home/weber#]echo -e '1\t2' 1 2
給終端來(lái)點(diǎn)顏色
-
在終端彩色輸出:
echo -e '\e[1;31m this is red text\e[0m' this is red text
-
更有用的是為我們提示符著色:
vi .profile添加:
export PS1='[[\e[34;1m]$PWD#\e[0m]'
-
注意環(huán)境變量的賦值錯(cuò)誤
var=value //賦值操作 echo $var
var = value //判斷相等操作[/home/weber#]var=5 [/home/weber#]echo 'this is $var' this is $var [/home/weber#]echo "this is $var" this is 5
-
獲取變量值的長(zhǎng)度:
length=${#var} //語(yǔ)法真詭異
-
打印程序的退出狀態(tài):
echo $?
-
對(duì).bashrc 修改的簡(jiǎn)便方法:
echo 'a=/abc/' >> ~/.bashrc
-
為rm打造回收站功能:
alias rm='cp $@ ~/backup; rm $@'
shell的控制結(jié)構(gòu)
-
條件判斷
if condition; then commands; elif condition; then commands else commands fi
-
循環(huán)結(jié)構(gòu)
for var in list; do commands; done
list可以是字符串或是序列;
echo {1..50} 生成列表
echo {a..z} -
更親切的for循環(huán)(類C)
for((int i = 0 ; i < 10 ;i++)) { commands; }
-
while循環(huán)
while condition do commands; done
算術(shù)比較
-
語(yǔ)法
if[ $var -eq 0 ] && action;
-gt :大于
-lt: 小于
-ge: 大于等于
-le: 小于等于
-a: 邏輯與
-o: 邏輯或 -
字符串的比較,最好使用雙中括號(hào)
[[ $str1 == $str2 ]]
[[ $str != $str ]]
支持 > 、 <
判空:-z 非空: -n -
if更友好:
if [[ -n $str ]] && [[ -z $str2 ]];
then
commands;
fi -
避免if語(yǔ)句過(guò)長(zhǎng)
[ condition ] && action ;//condition為真,則執(zhí)行action
[ condition ] && action; // condition 為假,則執(zhí)行aciton
注意:condition 和[ ] 之間必須有空格,否則報(bào)錯(cuò);
目錄操作
-
創(chuàng)建長(zhǎng)路徑目錄:
mkdir -p colin/soft/redis/
-
粘滯位和setuid:
chmod a+t file_dir/
設(shè)置了粘滯位,只有目錄的所有者才有權(quán)限刪除該目錄
-
讓所有用戶都有權(quán)限執(zhí)行文件:
chown root.root file chmod +s file
設(shè)置setuid文件權(quán)限后,它運(yùn)行其它用戶以文件所有者身份來(lái)執(zhí)行文件;
tips:只有l(wèi)inux 的elf二進(jìn)制文件才可設(shè)置這個(gè)文件權(quán)限; -
文件寫(xiě)保護(hù)
chattr +i file //文件不可修改、不可刪除
-
touch的妙用
touch可用來(lái)生成空白文件;如果文件存在,則更新時(shí)間戳;
eg:批量生成100個(gè)空白文件for name in test{0..100}.txt do touch $name done
-
只列出目錄的方法
- ls -d */
- ls -F| grep '/$' //-F會(huì)在文件尾部列出文件類型;
- ls -l| grep '^d' //-l第一行第一個(gè)字符是文件類型;
- find . -type d -maxdepth 1 -print
-
切換目錄快速定位
壓入并切換:pushd /var/www dirs: 顯示當(dāng)前路徑棧
pushd +3
popd
網(wǎng)站下載
wget url:直接下載文件或者網(wǎng)頁(yè);
--limit-rate :下載限速,別太快
-o:指定日志文件;輸出都寫(xiě)入日志;
-c:斷點(diǎn)續(xù)傳
wget -c ftpUrl
下載整個(gè)站點(diǎn)所有頁(yè)面
wget --mirror me115.com
或者:
wget -r -N -l DEPTH me115.com
-l:指定頁(yè)面層級(jí)的深度;
-N:允許對(duì)文件使用時(shí)間戳;
格式化文本形式下載網(wǎng)頁(yè)
lynx -dump URL > web.txt
-dump選項(xiàng)將網(wǎng)頁(yè)已ASCII字符形式下載到文本文件中;
更多
如果需要更豐富的下載功能,考慮使用curl;其支持多種協(xié)議,
還支持POSF、cookie、認(rèn)證、用戶代理字符串等特性;
如果你想將網(wǎng)頁(yè)處理流程自動(dòng)化,cURL是很好的選擇;
tar 歸檔工具
-
歸檔:
tar -cvf output.tar dir/
-c:創(chuàng)建規(guī)定
-f:指定文件名
-v:在歸檔或解開(kāi)時(shí)顯示更多的詳細(xì)信息 -
-r:追加文件到歸檔中:
tar -rvf output.tar dir2/
-
-t:顯示歸檔內(nèi)容;
tar -tf output.tar
-
提取歸檔文件:
tar -xvf output.tar
-
歸檔時(shí)排序版本控制目錄(svn、cvs、git等目錄信息):
tar --exclude-vcs -czvf source_code.tar.gz source/
rsync 備份系統(tǒng)快照
rsync -av source_path destination_path
-a:表示歸檔;-v:歸檔時(shí)顯示詳細(xì)信息
-z:指定在網(wǎng)絡(luò)傳輸時(shí)使用數(shù)據(jù)壓縮;
路徑可以是遠(yuǎn)程路徑:
eg:rsync -avz source_dir usrname@host:path;
(如果不希望使用交互式的密碼輸入,可使用SSH密鑰來(lái)實(shí)現(xiàn))
注:source_dir末尾如果使用路徑/,那么rsync會(huì)將source_dir目錄中的所有
內(nèi)容復(fù)制到目的端;如果沒(méi)有帶/,則會(huì)將source_dir本身復(fù)制到目的端;
備份時(shí)排除部分文件:
rsync -avz /home/code /mnt/disk/bakup --exclude "*.txt"
可使用一個(gè)列表文件指定需要排除的的文件:
--exclude-from FILEPATH
ftp自動(dòng)傳輸
使用ftp選項(xiàng)-i關(guān)閉交互會(huì)話;
eg ftp.sh:
!/bin/bash
HOST='me115.com'
USER='colin'
PASSWD='passwd'
ftp -i -n $HOST <<EOF
user ${USER} ${PASSWD}
binary
cd /home/linux
put test.php
quit
EOF
磁盤(pán)管理
-
顯示文件大小
du -h filename
-
統(tǒng)計(jì)文件夾的詳細(xì)大小及總計(jì)
du -ch svn_archives/
-s 只輸出合計(jì)信息;
-
找出指定目錄中最大的文件
du -ak source_dir | sort -nrk 1| head
-a:掃描指定目錄下所有文件(遞歸到最深一級(jí)目錄)
結(jié)果單位指定:-k KB -m MB -h 人性化顯示(打算排序的時(shí)候,不要用這個(gè),因?yàn)閱挝徊唤y(tǒng)一了)
上述結(jié)果中包含了目錄,如果只看文件,不需要目錄:find . -type f -exec du -k {} \; | sort -nrk 1| head
故障排查
- 當(dāng)前登錄用戶:who
- 當(dāng)前登錄主機(jī)的用戶列表:users
- 排除重復(fù)用戶:users | tr ' ' '\n' | sort |uniq
- 系統(tǒng)運(yùn)行時(shí)長(zhǎng): uptime
- 獲取登錄會(huì)話信息:last (單個(gè)用戶 last colin)
-
列出系統(tǒng)開(kāi)放端口及運(yùn)行的服務(wù):
lsof -i 或者: netstat -tnp
使用syslog記錄日志
向syslog文件/var/log/messages中記錄日志信息:
logger hello,this is colin
發(fā)送帶標(biāo)記的日志信息
logger -t ME115 hello,colin coming
/etc/rsyslog.d/下配置了標(biāo)記和日志的對(duì)應(yīng)關(guān)系;
殺死進(jìn)程
-
通過(guò)進(jìn)程名獲取進(jìn)程id
ps -C command_name
-
通過(guò)命令名終止進(jìn)程:
killall process_name
-
通過(guò)名稱強(qiáng)殺進(jìn)程:
kill -9 process_name
-
找出命令所在位置:
which php whereis php
-
列出命令簡(jiǎn)短描述信息:
whatis ls
用/proc收集信息
-
獲取cpu信息:
cat /proc/cpuinfo
-
獲取內(nèi)存信息:
cat /proc/meminfo
-
獲取分區(qū)信息:
cat /proc/partitions
/proc/PID/下的重要文件:
environ:包含與進(jìn)程相關(guān)的環(huán)境變量;
exe:到進(jìn)程工作目錄的符號(hào)鏈接;
fd:進(jìn)程所使用的文件描述符
Posted by: 大CC | 18NOV,2013
博客:
blog.me115.com
微博:
新浪微博
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元
