Linux Shell腳本攻略 讀書筆記php
這是一本小書,總共253頁,但內容卻很豐富,書中的示例小巧而實用,對我這樣老是在shell門前徘徊的人來講真是如獲至寶;
最有價值的當屬文本處理,對這塊我單獨整理出來一篇blog,詳見《Linux Shell文本處理工具集錦》
下面是文本處理以外的簡單介紹,若是你以爲本身的shell須要充充電,強烈建議讀讀這本《linux Shell腳本攻略》。python
從 echo開始:
帶引號的 echo和不帶引號的 echo區別:
使用帶引號時,bash 不會對單引號中的變量進行求值,而是原樣輸出;
而使用雙引號,或者不使用引號,則會對變量進行解析:linux
echo '$var' // $varecho $var // 5echo "$var" // 5
對比printf 的格式化輸出
printf 「%-5s %-10s %-4s」 NO NAME HELLO //左對齊 寬度爲 5 10 4
具體的值使用右邊引號外的;git
對比 python中的輸出:
printf 」 %s 」 % 「hello」web
讓echo支持轉義字符:-eredis
[/home/weber#]echo -e '1\t2'1 2
在終端彩色輸出:shell
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]'bash
注意環境變量的賦值錯誤
var=value //賦值操做 echo $var
var = value //判斷相等操做cookie
[/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 $@'
條件判斷
if condition;thencommands;elif condition;thencommandselsecommandsfi
循環結構
for var in list;docommands;done
list能夠是字符串或是序列;
echo {1..50} 生成列表
echo {a..z}
更親切的for循環(類C)
for((int i = 0 ; i < 10 ;i++)){commands;}
while循環
while conditiondocommands;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}.txtdotouch $namedone
只列出目錄的方法
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 -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
當前登陸用戶:who
當前登陸主機的用戶列表:users
排除重複用戶:users | tr ' ' '\n' | sort |uniq
系統運行時長: uptime
獲取登陸會話信息:last (單個用戶 last colin)
列出系統開放端口及運行的服務:
lsof -i或者:netstat -tnp
向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
獲取cpu信息:
cat /proc/cpuinfo
獲取內存信息:
cat /proc/meminfo
獲取分區信息:
cat /proc/partitions
每個運行的進程在/proc下都有一個以該進程id命名的目錄,/proc/PID/下的重要文件:environ:包含與進程相關的環境變量;exe:到進程工做目錄的符號連接;fd:進程所使用的文件描述符