1. 程式人生 > >shell 基礎 $(cd `dirname $0`;pwd)

shell 基礎 $(cd `dirname $0`;pwd)

在命令列狀態下單純執行 $ cd `dirname $0` 是毫無意義的。因為他返回當前路徑的"."。這個命令寫在指令碼檔案裡才有作用,他返回這個指令碼檔案放置的目錄,並可以根據這個目錄來定位所要執行程式的相對位置(絕對位置除外)。 在/home/admin/test/下新建test.sh內容如下:

  1. cd `dirname $0`
  2. echo `pwd`

然後返回到/home/admin/執行

  1. sh test/test.sh

執行結果:

  1. /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} $#  求值位置引數個數 $*  求值所有位置引數 "$*" [email protected] "[email protected]"

引用 () 命令組,建立子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 --將清除所有位置引數 $*與[email protected]的區別只在於" "時,當$*放在""內時,引數表成為單個字串,而[email protected]放在""內時,每個引數都被引號括住。

表示式

評估表示式

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            獲得程序開啟的檔案

摘自: