dirname和shell常用命令


$ cd `dirname $0` 和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            獲得進程打開的文件

 

  • $(cd `dirname $0`; pwd)

在命令行狀態下單純執行 $ cd `dirname $0` 是毫無意義的。因為他返回當前路徑的"."。這個命令寫在腳本文件里才有作用,他返回這個腳本文件放置的目錄,並可以根據這個目錄來定位所要運行程序的相對位置。

  •  declare  

 

+/-:"-"可用來指定變量的屬性,"+"則是取消變量所設的屬性;
-f:僅顯示函數;
r:將變量設置為只讀;
x:指定的變量會成為環境變量,可供shell以外的程序來使用;
i:[設置值]可以是數值,字符串或運算式。

 

declare命令用於聲明和顯示已存在的shell變量。當不提供變量名參數時顯示所有shell變量。declare命令若不帶任何參數選項,則會顯示所有shell變量及其值。declare的功能與typeset命令的功能是相同的。   

  • if [ "$#" -ne "8"  ]; then

 

$# 表示提供到shell腳本或者函數的參數總數;
$1 表示第一個參數。
-ne 表示 不等於

另外:
整數比較
-eq 等於,如:if ["$a" -eq "$b" ]
-ne 不等於,如:if ["$a" -ne "$b" ]
-gt 大於,如:if ["$a" -gt "$b" ]
-ge 大於等於,如:if ["$a" -ge "$b" ]
-lt 小於,如:if ["$a" -lt "$b" ]
-le 小於等於,如:if ["$a" -le "$b" ]
< 小於(需要雙括號),如:(("$a" < "$b"))
<= 小於等於(需要雙括號),如:(("$a" <= "$b"))
> 大於(需要雙括號),如:(("$a" > "$b"))
>= 大於等於(需要雙括號),如:(("$a" >= "$b"))

另外:$?是shell變量,表示"最后一次執行命令"的退出狀態.0為成功,非0為失敗.

basename命令

語法:basename string [suffix]

用於返回一個字符串的基本文件名稱

basename命令讀取string參數,刪除以 / 結尾的前綴以及任何指定的suffix參數,並將剩余的基本文件名稱寫至標准輸出。

basename命令應用以下創建基本文件名稱的規則:

1· 如果 String 參數是 //(雙斜杠) 或如果 String 參數包含的都是斜杠字符,則將字符串更改為單個 /(斜杠)。跳過步驟 2 到 4。

從指定字符串除去任何拖尾的 / 字符。

2· 如果在 String 參數中剩余任何 / 字符,則除去字符串的前綴直到(包含)最后一個 / 字符。
3· 如果指定 Suffix 參數,且它和字符串中的剩余的字符相同,則不修改此字符串。例如,輸入:
# basename /u/dee/desktop/cns.boo cns.boo
結果是:
cns.boo
    如果指定 Suffix 參數,且它和字符串中所有字符都不相同,但和字符串的后綴相同,則除去指定后綴。例如,輸入:
# basename /u/dee/desktop/cns.boo .boo

結果是:
cns
    不能在字符串中查找到指定的后綴不作為錯誤處理。

示例

(1)要顯示一個 shell 變量的基本名稱,請輸入:
basename $WORKFILE
此命令顯示指定給 shell 變量 WORKFILE 的值的基本名稱。如果 WORKFILE 變量的值是 /home/jim/program.c 文件,則此命令顯示 program.c

# basename /usr/bin/sort 
 # sort

(2)要構造一個和另一個文件名稱相同(除了后綴)的文件名稱,請輸入:
OFILE=`basename $1 .c`.o
此命令指定給 OFILE 文件第一個位置上的參數($1)的值,但它的 .c 后綴更改至 .o。如果 $1 是 /home/jim/program.c 文件,則 OFILE 成為 program.o。因為 program.o 僅是一個基本文件名稱,它標識在當前目錄中的文件。
注:`(重音符號)指定命令替換。

 

dirname命令

用途說明
dirname命令可以取給定路徑的目錄部分(strip non-directory suffix from file name)。這個命令很少直接在shell命令行中使用,我一般把它用在shell腳本中,用於取得腳本文件所在目錄,然后將當前目錄切換過去。根據手冊頁上說的“Print  NAME  with  its  trailing  /component  removed; if NAME contains no /’s, output ‘.’ (meaning the current directory).”,似乎說“取給定路徑的目錄部分” 並不能很准確的概括dirname命令的用途。Linux下還有一個命令是basename,它與dirname相反,是取得文件名稱部分。
常用參數
無。
使用示例
示例一 來自手冊頁的例子
[root@qzt196 ~]# dirname /usr/bin/sort 
/usr/bin
[root@qzt196 ~]# dirname stdio.h 
.
[root@qzt196 ~]#
示例二
[root@qzt196 ~]# dirname /usr/bin 
/usr
[root@qzt196 ~]# dirname /usr/bin/ 
/usr


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM