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

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