這個命令寫在腳本文件里才有作用,他返回這個腳本文件放置的目錄,並可以根據這個目錄來定位所要運行程序的相對位置(絕對位置除外)。
在/home/admin/test/下新建test.sh內容如下:
- cd `dirname $0`
- echo `pwd`
- sh test/test.sh
- /home/admin/test
PWD%/* shell變量的一些特殊用法
BASH使用基礎
關於命令及命令類型
對於使用的命令BASH使用hash表,以加速下次的查找,為添加一個經常使用的命令,可以使用hash cmd
BASH在執行命令時對路徑中找到的同名命令按以下的類型順序執行:別名 keywords 函數 內置命令 可執行文件或腳本
BASH在執行用戶輸入的一條指令時,首先要判斷命令的類型,可以使用type cmd來查看cmd是類型。
enable命令用來決定是否開啟某個內置的命令,可以用enable -n cmd來禁用某個內置命令。
command命令用來消除別名和函數的查找。
builtin命令將只查找內置命令,而忽略函數和可執行文件。
作業控制:jobs %1 fg bg kill stop等
別名:alias dir='dir -l' unalisa dir
操作目錄棧:dirs pushd popd
文件名替換:dir d[1-3] ls .bash{rc,profile} 支持[]對數字及{}對字符串的集合
變量
變量聲明:declare -a 數組 -f 函數 -i 整數 -r 只讀 -x 導出變量
本地變量只在其所聲明的shell中有效,只讀變量不能被修改,除非重新聲明其屬性
常見的環境變量:
BASH_VERSION DIRSTACK EUID EDITOR GROUPS HISTFILE HISTSIZE HOME LANG PWD OLDPWD PATH
PPID PS1-4 RANDOM SHELL UID
export var = value -f 導出的變量為函數 -n 將全局轉為局部變量 -p只打印導出的變量
非只讀變量可以通過unset清除、
變量替換
${var:-word} 如果變量var已經設置且非空,結果為var的值,否則結果為word
${var:=word} 如果變量var已經設置且非空,結果為var的值,否則設置var為word
${var:+word} 如果變量var已經設置且非空,則設置var的值為word;否則不替換
${var:?word} 如果變量var已經設置且非空,則替換為word,否則退出shell。
${var:n} 替換為從n開始的子串
${var:n:len} 替換為從n開始長len的子串
變量擴展
${var%pattern} 去掉最小匹配的后綴 echo ${PWD%/*} 顯示當前的父目錄路徑
${var%%pattern} 去掉最大匹配的后綴
${var#pattern} 去掉最小匹配的前綴
${var##pattern} 去掉最大匹配的前綴 echo ${PWD##*/} 顯示當前目錄名稱
${#var} 替換為變量字符個數
特殊變量
$ 當前SHELL的PID
? 前一個命令的退出狀態
! 后台執行的上一個工作的PID
讀取用戶輸入
read 從終端讀取輸入存入內置變量REPLY
read var 從終端讀取輸入存入變量var
read first .. last 從終端讀取多個變量依次存入,若輸入較多,則最后一個變量成為包含多個值的字串
read -a array 從終端讀取多個值存入數組中
read -p pmtstring var 向終端輸出提示串,然后讀入輸入到var中
read -r line 讀取一行,並允許/
變量類型轉換
如果變量在聲明時沒確定類型,則變量根據賦值情況可以動態轉換類型,但如果聲明時變量類型已經確定,若賦值為其他類型,將導致原有數據丟失或出錯。除非重新聲明類型。
對於整數類型的變量,則在命令行支持算法擴展,如num=3*4,支持"",不支持空格。
進制
var=16#abc var為16進制數abc
輸出
printf "The number is %.2f/n" 100
echo -ne "hello/nworld/n" -e 表示需要解析轉義字符,-n 表示不自動添加換行符
位置參數
$0 1-0 ${10}
$# 求值位置參數個數
$* 求值所有位置參數
"$*"
$@
"$@"
引用
() 命令組,創建子SHELL執行
{} 命令組,不創建子SHELL
' ' 保護所有的元字符不被解析,想打印',必須放在雙引號內,或者使用/轉義
" " 只允許變量和命令替換,保護其余的元字符不被解析
命令替換
`cmd`
$(cmd)
二者結果都是一個字符串,如果加"",則保留換行,否則丟失換行。
數學表達式擴展
$[ exp ]
$(( exp ))
f
數組
declare -a array=(item1 item2 ...)
數組元素的引用 ${array[i]}
引用整個數組 ${array[*]}
unset array
函數定義
function f()
{
cmd;cmd;
}
I/O重定向
find . name /*.c print > foundit 2>&1
命令行參數
set可用來設置位置參數,使用set --將清除所有位置參數
$*與$@的區別只在於" "時,當$*放在""內時,參數表成為單個字符串,而$@放在""內時,每個參數都被引號括住。
表達式
評估表達式
expr $[3+4] $[ 3+4 ] $(( 3+4 ))
let算術擴展
let i=i+1 支持任何C類型的運算符,但只支持整形數運算
bash不支持小數運行,因此需要在bc或者awk中進行相應的運行,再把結果回。由於bash沒有浮點型,所以小數是以字符串表示。
測試表達式
測試可以使用test或者單純的[ expr1 cmp expr2],結果保存於?變量中,即test與[]等價
字符串測試
[ str1 = str2 ] str1與str2相同或==
[ str1 != str2 ] st1與str2不相同
[ str ] str非空
[ -z str ] str的長度為0
[ -n str ] str的長度非0
[ -l str ] str的長度
[ str1 -a str2 ] and
-o or
! not
復合條件測試
[[ p1 && p2 ]] p1與p2均為真
[[ p1 || p2 ]]
[[ !p2 ]]
整數測試
[ num1 -eq num2 ]
[ numb1 -ne num2 ]
gt ge lt le
文件屬性測試
[ file1 nt file2 ] 文件1比文件2新
[ file1 ot file2 ]
[ file1 ef file2 ]
[-d file] file為目錄
-b -c -p -L -S 塊文件,字符文件,管道,鏈接,socket
-e -f 文件存在,常規文件
-G 文件存在且擁有有效GID
-O 文件存在且擁有有效UID
-g 設置GID
-k 設置stick位
-r -w -x 文件可讀,可寫,可執行的
-s 文件大小非0
-t 文件fd在終端打開
-u setUID位設置
測試表達可以與let的運算擴展及(( ))中的C型運算擴展是等價的,后者也許更容易理解,C-like。
條件控制
if command
then
command
command
fi
if test expression
then
command
fi
if [ string/numeric expression ] then
command
fi
if [[ string expression ]] then
command
fi
if (( numeric expression ))
if command
then
command(s)
else
command(s)
fi
if command
then
command(s)
elif command
then
commands(s)
elif command
then
command(s)
else
command(s)
fi
空命令 :
分支跳轉
case variable in
value1)
command(s)
;;
value2)
command(s)
;;
*)
command(s)
;;
esac
循環
for variable in word_list
do
command(s)
done
while condition
do
command(s)
done
until command
do
command(s)
done
構建菜單的select
select program in 'ls -F' pwd date
do
$program
done
中斷循環
break [n] 從第n層循環中跳出
continue [n] 繼續第n層循環
捕獲信號
信號列表
1) SIGHUP 9) SIGKILL 17) SIGCHLD 25) SIGXFSZ
2) SIGINT 10) SIGUSR1 18) SIGCONT 26) SIGVTALRM
3) SIGQUIT 11) SIGSEGV 19) SIGSTOP 27) SIGPROF
4) SIGILL 12) SIGUSR2 20) SIGTSTP 28) SIGWINCH
5) SIGTRAP 13) SIGPIPE 21) SIGTTIN 29) SIGIO
6) SIGABRT 14) SIGALRM 22) SIGTTOU 30) SIGPWR
7) SIGBUS 15) SIGTERM 23) SIGURG
8) SIGFPE 16) SIGSTKFLT 24) SIGXCPU
trap 'command; command' signal-number-list
trap 'command; command' signal-name-list 處理信號,當收到singal-list中的信號后,執行 ''中的命令
trap singal 重置信號處理函數
trap 列出已經設置信號處理
調試腳本
bash -x script 顯示命令執行過程,及結果
bash -v script 顯示腳本中的各行
bash -n script 解釋但不執行
附錄:
常用命令
script myfile 將終端交互信息保存在myfile中,使用control+d退出
fuser -n tcp 22 獲得打開tcp 22的進程
lsof 獲得進程打開的文件
摘自:
http://hi.baidu.com/lianhuxu/blog/item/d059b8b569271ec337d3ca5a.html
http://hi.baidu.com/lixinxinhit/item/9d95758a39324756e63d1909