Linux Shell腳本攻略 讀書筆記php
這是一本小書,總共253頁,但內容卻很豐富,書中的示例小巧而實用,對我這樣老是在shell門前徘徊的人來講真是如獲至寶;
最有價值的當屬文本處理,對這塊我單獨整理出來一篇blog,詳見《Linux Shell文本處理工具集錦》
下面是文本處理以外的簡單介紹,若是你以爲本身的shell須要充充電,強烈建議讀讀這本《linux Shell腳本攻略》。python
從 echo開始:
帶引號的 echo和不帶引號的 echo區別:
使用帶引號時,bash 不會對單引號中的變量進行求值,而是原樣輸出;
而使用雙引號,或者不使用引號,則會對變量進行解析:linux
echo '$var' // $var echo $var // 5 echo "$var" // 5
對比 python中的輸出:
printf " %s " % "hello"git
讓echo支持轉義字符:-eweb
[/home/weber#]echo -e '1\t2' 1 2
在終端彩色輸出:redis
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]' shell
注意環境變量的賦值錯誤
var=value //賦值操做 echo $var
var = value //判斷相等操做bash
[/home/weber#]var=5 [/home/weber#]echo 'this is $var' this is $var [/home/weber#]echo "this is $var" this is 5
獲取變量值的長度:cookie
length=${#var} //語法真詭異
echo $?
echo 'a=/abc/' >> ~/.bashrc
alias rm='cp $@ ~/backup; rm $@'
條件判斷網絡
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
只列出目錄的方法
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 -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 -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選項-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
lsof -i 或者: netstat -tnp
向syslog文件/var/log/messages中記錄日誌信息:
logger hello,this is colin
發送帶標記的日誌信息
logger -t ME115 hello,colin coming
/etc/rsyslog.d/下配置了標記和日誌的對應關係;
ps -C command_name
killall process_name
經過進程id強殺進程:
kill -9 process_id
找出命令所在位置:
which php whereis php
列出命令簡短描述信息:
whatis ls
cat /proc/cpuinfo
cat /proc/meminfo
cat /proc/partitions每個運行的進程在/proc下都有一個以該進程id命名的目錄,
Posted by: 大CC | 18NOV,2013
博客:blog.me115.com
微博:新浪微博