$ operator的三種擴展模式
${variable_name}
$(command)
$((expression))
字串操作
${variable:start_position}
${variable:start:length}
${#variable}字串長度
算術運算
$((expression))
expr expression
$[expression]
declear -i var=expression
let expression
r=$((2+3))
r=`expr 3+2`
r=$[4+5]
declare -i r=5*5
let i=5+5
條件判斷
if test1; then
statements
elif test2; then
statements
...
else
statements
fi
測試條件仿照c的邏輯,非null/0為真
if [-d /root/tmp]; then
echo '/root/temp directory exists!'
else
echo "/root/temp directory doesn't exist!"
2012年3月17日
2012年3月13日
linux所支援的檔案系統
使用
cat /proc/filesystems
就會列出支援的檔案類型,尤其在
嵌入式 系統,這應該特別有用,因為嵌入式常會因為占用記憶體空間的關係取消某些檔案類型的支援
2012年3月8日
bash shell script兩三事 (2)
bash shell變數就是
varName=value
如果沒有特別指出,一律default為string,也就是說
varNum=1這裡會變成字串1而非數字1
提取的變數value的方式有兩種
$varName跟${varName}
字串建議使用" "或者' '包起來,兩者不一樣是前者會做變數替換,後者不會,比方說
varName="jacky"
str1="Hi! $varName"
str2='Hi! $varName'
其中str1會顯示Hi! jacky!,而str2則保持原來的樣子
printf則是類似C的使用方式,不一樣的是,printf會幫字串中特殊字元加上跳脫符號(\)
shopt -s -o nounset
表示必須在使用前必須有assign value的動作,可以避免寫錯變數
unset varName
則可以刪除變數,而
varName=
則可以刪除環境變數
變數可以輸出為環境變數,只用
export varName
其中有兩個特別的環境變數為LOGNAME與USER,LOGNAME指的是登入時後的名稱,USER是只現在身分的名稱,假如你已jacky這個一般ID登入,然後使用su變成super user,這時候LOGNAME為jakcy,USER為root。因為LOGNAME的關係,你所使用的PATH還是jacky的,並不包含/sbin下的指令,所以在使用一些指令的時候會遭遇command not found的問題,只要用
su -
加上一個減號,就可以讓LOGNAME也改成root了
一些特殊的變數
$1~$9,表示shell command後面的參數,如果超過第十個開始要使用${10}這樣的形式
$*表示所有參數所形成的字串
$@表示將參數以振烈表示
$#表示參數的個數
$$表示執行該shell command的PID
readonly可以用來宣告唯讀變數
readonly varName
readonly -a arrayName
第一個宣告一變數為唯讀,第二個宣告唯讀陣列
decleare指令可以調整以及顯示變數的屬性
變成唯讀
declare -r varName
宣告陣列
declare -a varName
宣告為整數型態
declare -i varName
宣告為環境變數
declare -x PATH
顯示函數及其屬性
declare -F
顯示變數屬性
declare -p varName
幾個重要的檔案
使用者個人設定
~/.bash_profile,登入時候執行的shell script
~/.bashrc,執行一個新的shell script之前執行
~/.bash_logout,登出的時候執行
系統管理者維護設定
/etc/profile,一些預設的設定,對全體user有效,通常有umask、PATH、LC_*等等設定
/etc/bash.bashrc,一份全域性的profile
/etc/skel下的檔案,使用者帳號建立的時候依照這裡組裝出.bash_profile與.bashrc
varName=value
如果沒有特別指出,一律default為string,也就是說
varNum=1這裡會變成字串1而非數字1
提取的變數value的方式有兩種
$varName跟${varName}
字串建議使用" "或者' '包起來,兩者不一樣是前者會做變數替換,後者不會,比方說
varName="jacky"
str1="Hi! $varName"
str2='Hi! $varName'
其中str1會顯示Hi! jacky!,而str2則保持原來的樣子
printf則是類似C的使用方式,不一樣的是,printf會幫字串中特殊字元加上跳脫符號(\)
shopt -s -o nounset
表示必須在使用前必須有assign value的動作,可以避免寫錯變數
unset varName
則可以刪除變數,而
varName=
則可以刪除環境變數
變數可以輸出為環境變數,只用
export varName
其中有兩個特別的環境變數為LOGNAME與USER,LOGNAME指的是登入時後的名稱,USER是只現在身分的名稱,假如你已jacky這個一般ID登入,然後使用su變成super user,這時候LOGNAME為jakcy,USER為root。因為LOGNAME的關係,你所使用的PATH還是jacky的,並不包含/sbin下的指令,所以在使用一些指令的時候會遭遇command not found的問題,只要用
su -
加上一個減號,就可以讓LOGNAME也改成root了
一些特殊的變數
$1~$9,表示shell command後面的參數,如果超過第十個開始要使用${10}這樣的形式
$*表示所有參數所形成的字串
$@表示將參數以振烈表示
$#表示參數的個數
$$表示執行該shell command的PID
readonly可以用來宣告唯讀變數
readonly varName
readonly -a arrayName
第一個宣告一變數為唯讀,第二個宣告唯讀陣列
decleare指令可以調整以及顯示變數的屬性
變成唯讀
declare -r varName
宣告陣列
declare -a varName
宣告為整數型態
declare -i varName
宣告為環境變數
declare -x PATH
顯示函數及其屬性
declare -F
顯示變數屬性
declare -p varName
幾個重要的檔案
使用者個人設定
~/.bash_profile,登入時候執行的shell script
~/.bashrc,執行一個新的shell script之前執行
~/.bash_logout,登出的時候執行
系統管理者維護設定
/etc/profile,一些預設的設定,對全體user有效,通常有umask、PATH、LC_*等等設定
/etc/bash.bashrc,一份全域性的profile
/etc/skel下的檔案,使用者帳號建立的時候依照這裡組裝出.bash_profile與.bashrc
2012年2月21日
遠端拍照的小工具
一直在找一個可以遠端使用command line就可以把網頁抓下的方式,其實有些方法,不過遇到一些困難,網路上大有其他GUI方式,可是都不是我要的
GUI的方式可以參考這裡
http://www.binarytides.com/blog/take-webpage-screenshot-from-command-line-in-ubuntu-linux/
command line本來打算用khtml2png,看似最簡單,很可惜ubuntu下找不到,無法測試
跟著這裡有只用firefox的shell script,但是要用到vncserver
http://stackoverflow.com/questions/125951/command-line-program-to-create-website-screenshots-on-linux
我執行的時候怎樣都遇到.Xresources找不到的問題,印象中ubuntu好像改了很多X-win的設定,我也不知道怎樣recover這些設定檔了
最後的解決方案
這是cutycapt裁剪網頁的工具,編譯完畢丟到/usr/bin下就是了,其實跟khtml2png一樣的引擎,可問提示沒有xserver無法執行
http://cutycapt.sourceforge.net/
沒關係,還有xvfb-run可以幫忙,安裝一下xvfb套件
xvfb-run --server-args="-screen 0, 1024x768x24" CutyCapt --url=http://www.kimo.com --out=slide.png
結果還不壞,css大多保留了,不過flash
參考資料
http://ddbean.wordpress.com/category/linux/
http://www.binarytides.com/blog/take-webpage-screenshot-from-command-line-in-ubuntu-linux/
最後順便有個爬到的轉檔案指令,可以將pdf轉乘png
convert -size 640x300 fileName.pdf slide.png
GUI的方式可以參考這裡
http://www.binarytides.com/blog/take-webpage-screenshot-from-command-line-in-ubuntu-linux/
command line本來打算用khtml2png,看似最簡單,很可惜ubuntu下找不到,無法測試
跟著這裡有只用firefox的shell script,但是要用到vncserver
http://stackoverflow.com/questions/125951/command-line-program-to-create-website-screenshots-on-linux
我執行的時候怎樣都遇到.Xresources找不到的問題,印象中ubuntu好像改了很多X-win的設定,我也不知道怎樣recover這些設定檔了
最後的解決方案
這是cutycapt裁剪網頁的工具,編譯完畢丟到/usr/bin下就是了,其實跟khtml2png一樣的引擎,可問提示沒有xserver無法執行
http://cutycapt.sourceforge.net/
沒關係,還有xvfb-run可以幫忙,安裝一下xvfb套件
xvfb-run --server-args="-screen 0, 1024x768x24" CutyCapt --url=http://www.kimo.com --out=slide.png
結果還不壞,css大多保留了,不過flash
參考資料
http://ddbean.wordpress.com/category/linux/
http://www.binarytides.com/blog/take-webpage-screenshot-from-command-line-in-ubuntu-linux/
最後順便有個爬到的轉檔案指令,可以將pdf轉乘png
convert -size 640x300 fileName.pdf slide.png
2012年2月6日
20常用系統監測指令/程式
#1: top - Process Activity Command
#2: vmstat - System Activity, Hardware and System Information
#3: w - Find Out Who Is Logged on And What They Are Doing
#4: uptime - Tell How Long The System Has Been Running
#5: ps - Displays The Processes
#6: free - Memory Usage
#7: iostat - Average CPU Load, Disk Activity
#8: sar - Collect and Report System Activity
#9: mpstat - Multiprocessor Usage
#10: pmap - Process Memory Usage
#11 and #12: netstat and ss - Network Statistics
#13: iptraf - Real-time Network Statistics
#14: tcpdump - Detailed Network Traffic Analysis
#15: strace - System Calls
#16: /Proc file system - Various Kernel Statistics
17#: Nagios - Server And Network Monitoring
18#: Cacti - Web-based Monitoring Tool
#19: KDE System Guard - Real-time Systems Reporting and Graphing
#20: Gnome System Monitor - Real-time Systems Reporting and Graphing
前面15個大體上來說都是command mode,16則是虛擬執行系統,裡面的資料很多是臨時的,直接用cat抓出來看就是,後面則是GUI或者web的程式
參考資料
http://www.cyberciti.biz/tips/top-linux-monitoring-tools.html
#2: vmstat - System Activity, Hardware and System Information
#3: w - Find Out Who Is Logged on And What They Are Doing
#4: uptime - Tell How Long The System Has Been Running
#5: ps - Displays The Processes
#6: free - Memory Usage
#7: iostat - Average CPU Load, Disk Activity
#8: sar - Collect and Report System Activity
#9: mpstat - Multiprocessor Usage
#10: pmap - Process Memory Usage
#11 and #12: netstat and ss - Network Statistics
#13: iptraf - Real-time Network Statistics
#14: tcpdump - Detailed Network Traffic Analysis
#15: strace - System Calls
#16: /Proc file system - Various Kernel Statistics
17#: Nagios - Server And Network Monitoring
18#: Cacti - Web-based Monitoring Tool
#19: KDE System Guard - Real-time Systems Reporting and Graphing
#20: Gnome System Monitor - Real-time Systems Reporting and Graphing
前面15個大體上來說都是command mode,16則是虛擬執行系統,裡面的資料很多是臨時的,直接用cat抓出來看就是,後面則是GUI或者web的程式
參考資料
http://www.cyberciti.biz/tips/top-linux-monitoring-tools.html
2011年6月27日
bash shell script (2)
http://fanqiang.chinaunix.net/a4/b1/index_b.html
#!/bin/bash
function name(){
echo "parameter 1:", $1
echo "parameter 2:", $2
echo "end"
}
name 'hi' 'world'
函數的參數是使用$1, $2, ...來代表,函數在呼叫的時候後面直接接空白,參數之間也是用空白隔開
#!/bin/bash
function name(){
echo "parameter 1:", $1
echo "parameter 2:", $2
echo "end"
}
name 'hi' 'world'
函數的參數是使用$1, $2, ...來代表,函數在呼叫的時候後面直接接空白,參數之間也是用空白隔開
2011年6月26日
bash shell script (1)
http://tldp.org/HOWTO/Bash-Prog-Intro-HOWTO.html
http://linuxocarina.blogspot.com/2007/06/bash-shell-script.html
老實說,bash shell script一直沒有深入研究:P因為總是拿python, java來取代:P網路上鳥哥的shell script教學感覺比較偏向管理面(一堆讀取檔案特性做處理的操作),我想比較偏向使用面(就是一般使用者轉檔之類的操作)
變數
一般使用大寫當作變數名稱的樣子,所以類似
COUNTER=1
提取變數的value要加上$ (dollar sign),比方說
echo $COUNTER
如果沒有加上$是差很多的,比方
echo ls
echo $(ls)
一個只會印出ls一個會印出所有檔案名稱
變數的運算,使用let關鍵字,比方說
let COUNTER=COUNTER+1
迴圈
for i in $(ls); do
echo item:$(i)
done
for迴圈的一個變數處理每個$(ls)變數內的元素,形成一個迴圈,當然也可以用類似COUNTER的方式
http://linuxocarina.blogspot.com/2007/06/bash-shell-script.html
老實說,bash shell script一直沒有深入研究:P因為總是拿python, java來取代:P網路上鳥哥的shell script教學感覺比較偏向管理面(一堆讀取檔案特性做處理的操作),我想比較偏向使用面(就是一般使用者轉檔之類的操作)
變數
一般使用大寫當作變數名稱的樣子,所以類似
COUNTER=1
提取變數的value要加上$ (dollar sign),比方說
echo $COUNTER
如果沒有加上$是差很多的,比方
echo ls
echo $(ls)
一個只會印出ls一個會印出所有檔案名稱
變數的運算,使用let關鍵字,比方說
let COUNTER=COUNTER+1
迴圈
for i in $(ls); do
echo item:$(i)
done
for迴圈的一個變數處理每個$(ls)變數內的元素,形成一個迴圈,當然也可以用類似COUNTER的方式
COUNTER=0 while [ $COUNTER -lt 10 ]; do echo The counter is $COUNTER let COUNTER=COUNTER+1 done
2011年6月18日
批次由eps to jpg的script
如果使用latex來寫文章的話,eps已經是一個很好的內容,可是如果你是用其他編輯器,或許圖形檔案是一個比較好的選擇,當已經產生了一堆eps,在由gs指令一個一個產生圖形檔是很呆板的工作,所以寫個script吧
DEVICE還有許多種,比方png16m可以輸出png圖檔,詳細內容可以看man page
for i in *.eps;其中r表示resolution,如果只有單一value則為value*value,如果是800x600就是指定了寬跟高
do
gs -sDEVICE=jpeg -dJPEGQ=100 -dNOPAUSE -dBATCH -dSAFER -r300 -sOutputFile="${i%.eps}".jpg "$i"
mogrify -trim -resize 800x600 "${i%.eps}".jpg
done
DEVICE還有許多種,比方png16m可以輸出png圖檔,詳細內容可以看man page
2011年4月11日
開機的時候關閉無線網路卡
主要在"偏好設定"=>"啟動應用程式"裡面加上以下指令作為啟動時候順便執行來diable wireless card
dbus-send --system --type=method_call --dest=org.freedesktop.NetworkManager /org/freedesktop/NetworkManager org.freedesktop.DBus.Properties.Set string:org.freedesktop.NetworkManager string:WirelessEnabled variant:boolean:false相信這不是一般人可以背得起來,就直接copy/paste吧,主要是參考這裡
2010年6月2日
dpkg指令(2)
接著來看一下dpkg -l出來的結果,其實很多參數讓人迷糊,最常看到的
- -ii:已經安裝(這很容易瞭解)
- -iU:下載回來還沒安裝
- -rc:表示有設定檔案尚未宜除
dpkg --get-selections | grep deinstall | awk '{ print $1 }' | xargs dpkg --purge
管他三七二十一,只要是rc的設定檔案通通剷除 ,只能說xargs真是個好物阿!!
dpkg指令(1)
相信許多玩過一陣子的人都知道dpkg指令可以做到許多事情,大多可以被apt跟aptitude取代,不過兩者骨子裡面還是dpkg,就先回顧一下debian wiki上的dpkg
dpkg 是 Debian GNU/Linux 底下管理套件的工具,提供比較低階的安裝維護功能,一般而言,使用者會使用比較友善的 dselect 或是 aptitude。還有這個討論區的討論
顯示目前裝在系統中的所有 packages(rpm 用 rpm -qa)
dpkg --list想知道總共有那些檔案安裝在系統中(rpm 為 rpm -ql samba)
dpkg --listfiles samba或是在系統中有某個執行檔, 想知道屬於那個 package, 這樣在別台機器中才有辦法安裝
$ which smbd /usr/sbin/smbd $ dpkg --search /usr/sbin/smbd samba: /usr/sbin/smbd最前面的 samba 即為 package 名稱, 先用 which 找到 smbd 這個執行檔放在那個路徑, 再用 dpkg --search 來找到 package
名稱(redhat 中則用 rpm -qf /usr/sbin/smbd)
看 package 的說明(redhat 為 rpm -qi samba)
dpkg --status package_name 或 dpkg -s package_name假設我們由網路上自行抓了一個 .deb 的檔回來, 這時就要用 dpkg 來安裝(redhat 為 rpm -i xxx.rpm)
dpkg --install package_name.deb 或 dpkg -i package_name.deb移除某個 package(rpm 為 rpm -e package_name)
dpkg --remove package_name 或 dpkg -r package_name徹底移除 package
dpkg --purge package_name 或 dpkg -P package_name在還未安裝到系統中前, 查看會安裝那些檔案在系統中(rpm 用 rpm -qlp xxx.rpm)
dpkg --contents package_name.deb 或 dpkg -c package_name.deb在還未安裝到系統中前, 查看 deb 檔es的資訊(rpm 用 rpm -qip xxx.rpm)
dpkg --info xxx.deb顯示目前各個軟體套件的安裝狀態(未安裝、正確安裝、被移除、完整移除、安裝失敗等等)
dpkg --get-selections如何在升級套件時, 讓某些套件不要更新:
echo "packagename hold" | dpkg --set-selections
這兩者應該提供了夠豐富的dpkg指令的使用方式首先要學習debian的中層包管理dpkg,這是一個基礎.
簡介
dpkg是 Debian的中級軟件包管理器,類似RPM.
dpkg是Debian軟件包管理系統的中流砥柱,負責安全卸載軟件包,配置,以及維護已安裝的軟 件包.也是Debian系統中眾多軟件包管理工具的後端.有關dpkg的更多介紹參閱:http://www.dpkg.org
系 統中所有packages的信息都在/var/lib/dpkg/目錄下,其中子目錄」/var/lib/dpkg/info」用於保存各個軟件包的配置 文件列表.
.conffiles 記錄了軟件包的配置文件列表
.list 保存軟件包中的文件列表,用戶可以從.list的信息中找到軟件包中文件的具體安裝位置.
.md5sums 記錄了軟件包的md5信息,這個信息是用來進行包驗證的.
.prerm 腳本在Debian報解包之前運行,主要作用是停止作用於即將升級的軟件包的服務,直到軟件包安裝或升級完成.
.postinst腳本是完成 Debian包解開之後的配置工作,通常用於執行所安裝軟件包相關命令和服務重新啟動.
/var/lib/dpkg/available文件的內 容是軟件包的描述信息,該軟件包括當前系統所使用的Debian安裝源中的所有軟件包,其中包括當前系統中已安裝的和未安裝的軟件包.
dpkg
查 詢以安裝的信息
查詢當前系統所有已安裝的deb包
dpkg –l 命令用於查詢當前系統所有以安裝的deb包的信息.,通過less和grep可以執行更複雜的查詢工作.
例如查找跟vim有關的軟件 包,dpkg –l |grep –ivim
(如發現iU 表示軟件包未安裝成功,ii表示安裝成功)
查看已安裝軟件包的詳細情 況
dpkg –s 命令查看軟件包的詳細情況,包括版本,依賴之類的
查詢系統中所安裝軟件包所安裝的文件
dpkg –L 命令用於查詢系統中所安裝軟件包的安裝的文件安裝到系統的位置和安裝了那些.
用apt-get install *
如 何可以看軟件包裝到哪個地方?
dpkg -L package-name|more
查詢系統中某個文件屬於那個軟件包
dpkg –S 命令用於瞭解當前的軟件屬於那個軟件包
查詢未安裝的信息
查詢未安裝軟件包詳細信息
dpkg –I 命令用於查看未安裝軟件包的詳細信息,以便瞭解該軟件包是否需要安裝.
查詢deb包文件中所包含的文件
dpkg –c 顯示未安裝deb軟件包所包含的文件列表,以及安裝位置
安裝軟件包
安裝deb軟件包
dpkg –i 手工安裝deb包到系統中,不過有時會存在Dpends關係,建議使用apt-get 來安裝.
如果通過dpkg –i安裝軟件後由於Dpends關係沒有安裝成功,可通過apt-get –f install解決
解決dpkg –i 安裝deb包出現Dpends問題
apt-get –f install 解決Dpends問題.
例如:dpkg –i lftp_3.1.3-1_i386.deb
Selecting previously deselected package lftp.
(Reading database … 20654 files and directories currently installed.)
unpacking lftp (from lftp_3.1.3-1_i386.deb)…
dpkg:dependency problems prevent configuration of lftp:
lftp depends on libexpat1 (<=1.95.8);however
dpkg : error processing lftp (--install)
dependency problems –leaving unconfigured
Errors were encountered while processing:
lftp
//lftp軟件包安裝失敗
dpkg –l |grep lftp
iU lftp 3.1.3-1 Sophisticated
command-line FTP/HTTP client p
//」 dpkg -l」 查詢信息表示lftp軟件包未安裝成功
(iU表示未安裝成功,ii表示安裝成功)
使用apt-get –f install解決
卸載deb軟件包
卸載deb包
dpkg –r用於卸載指定的軟件包,該命令只卸載軟件包安裝到系統中的文件,而不去刪除軟件包的配置文件,因此不是完全意義上的卸載.但是軟件包保存在系統中,可 以提供給以後在安裝軟件包時使用.
例如:dpkg –r prozilla 移除後再用dpkg –l |grep prozilla 查看
會看到rc proc 1.3.6-3woody3 multi-thraded download accelerator
表 示軟件包已經被卸載,但配置文件仍在「rc」帶表配置文件仍在.
卸載軟件包並清除配置文件
dpkg –P 用於卸載軟件包同時也刪除配置文件,dpkg –P 不能解決Dpends問題,建議卸載時使用apt-get操作
重新配置軟件包
對 於Debian系統中的眾多軟件包(尤其是系統和服務器軟件包)來說,在第一次安裝該軟件包時候會顯示對話框窗口,提示用戶輸入必要的配置信息.當用戶需 要再次對軟件包配置的時候,可以使用dpkg-reconfigure來對指定的軟件包進行配置.
比如dpkg-reconfigure locales
用於配置語言
alien包轉換工具
如果我們有很喜歡的RPM包,而又沒有deb版本.
怎 麼辦~?
可以同過alien來轉換或者直接安裝,這個小傢伙可是個很方便的東西!
基本命令如下:
首先通過apt-get install alien來安裝.
然後
alien -i name-of-the-pakage.rpm /*用來直接安裝rpm包
alien -d , --to-deb /*Make debian packages,This is the default
例:alien –d package.rpm
alien –r , --to-rpm /*Make rpm packages
例:alien –r package.deb
alien –p , --to-pkg /*Make Solaris pkg packages
alien –-to-slp /*Make slp packages
alien –t , --to-tgz /*Make tgz packages
alien –T 檢測
alien –-patch=patch 設置patch