Linux Shell學習筆記(5):shell編程中必用的一些基本語法($、##、%%等特殊符號;if 、dirname\basename、local、readlink、exportt等關鍵字)

一、特使符號及使用

1. $

符號 參數
$$ Shell本身的PID(ProcessID)
$! Shell最後運行的後臺Process的PID
$? 最後運行的命令的結束代碼(返回值)
$- 使用Set命令設定的Flag一覽
$* 所有參數列表。如"$*“用「”」括起來的情況、以"$1 $2 … $n"的形式輸出所有參數。
$@ 所有參數列表。如"$@“用「”」括起來的情況、以"$1" “2""2" … "n” 的形式輸出所有參數。
$# 添加到Shell的參數個數
$0 Shell本身的文件名
$1~$n 添加到Shell的各參數值。$1是第1參數、$2是第2參數
$() 做命令替換,先完成小括號裏的命令,然後在引用產生的變量值如下**(命令1)**,作用同反引號 ` `
${ } $var 與 ${var}是沒有區別的,但是用${ }會比較精確的界定變量名稱的範圍
  1. 命令1
root@juzuodaliyun:~@ echo today is $(date "+%Y-%m-%d")
today is 2020-05-17

2. ## 、 %% 、#

#!/bin/bash
file=/dir1/dir2/dir3/my.file.txt
echo ${file#*/} #刪掉第一個 / 及其左邊的字符串:dir1/dir2/dir3/my.file.txt
echo ${file##*/} #刪掉最後一個 /  及其左邊的字符串:my.file.txt
echo ${file#*.} #刪掉第一個 .  及其左邊的字符串:file.txt
echo ${file##*.} #刪掉最後一個 .  及其左邊的字符串:txt
echo ${file%/*} #刪掉最後一個  /  及其右邊的字符串:/dir1/dir2/dir3
echo ${file%%/*} #刪掉第一個 /  及其右邊的字符串:(空值)
echo ${file%.*} #刪掉最後一個  .  及其右邊的字符串:/dir1/dir2/dir3/my.file
echo ${file%%.*} #刪掉第一個  .   及其右邊的字符串:/dir1/dir2/dir3/my
root@juzuodaliyun:/home/test@ sh test.sh
dir1/dir2/dir3/my.file.txt
my.file.txt
file.txt
txt
/dir1/dir2/dir3

二、常用關鍵字

1. if

if 的用法都知道,在編程中主要用於條件判斷,但是需要注意的點是在Linux shell編程中特有的符號和參數

參數 含義
-eq 相等 =
-ne 不等 !=
-gt 大於 >
-ge 大於等於 >=
-lt 小於 <
-le 小於等於 <=

上述是比價常見的比較數值大小的參數
還有另外的參數用於判斷文件是否存在,文件及是否爲空,文件大小等等,如果是在其他編程語言中,你需要重新寫一個函數用於判斷,然後字啊條件語句中引用函數並傳參,但是在shell中個,你只需要一個參數就可以搞定~

參數 含義
-r 用戶可讀爲真
-w 用戶可寫爲真
-x 用戶可執行爲真
-f 文件爲正規文件爲真
-d 文件爲目錄爲真
-c 文件爲字符特殊文件爲真
-b 文件爲塊特殊文件爲真
-s 文件大小非0時爲真
-t 當文件描述符(默認爲1)指定的設備爲終端時爲真
-a
-o
!

上面的三種寫在括號內,對應的 && || 寫在中括號之間。例如,if [ "$a" eq 1 -o "$b" eq 2 ] && [ "$c" eq 3 ]

2.dirname、basename

如何把/dir1/dir2/dir3/file中的,前半部分:/dir1/dir2/dir3和最後部分file 分割,這個用字符串分隔及${str//}來處理還比較難辦,這個時候basename和dirname命令就很方便了。

(1) dirname

dirname命令可以取給定路徑的目錄部分,一般在shell腳本中用的比較多,命令行中使用的較少。

root@juzuodaliyun:/home/test@ dirname /home/test/test.sh
/home/test

下面這段是找到的一個大佬博主寫的例子,感覺很好,貼在這裏跟大家分享~

!/bin/bash  
  
# 跳轉到腳本所在目錄  
cd $(dirname "$0") || exit 1  
  
# 對上面的腳本的解釋
$0          	  當前Shell程序的文件名
dirname $0  	  獲取當前Shell程序的路徑
cd $(dirname $0)  進入當前Shell程序的目錄
exit 1            如果獲取不到則退出腳本
# ————————————————
#版權聲明:本文爲CSDN博主「傑瑞26」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
#原文鏈接:https://blog.csdn.net/Jerry_1126/article/details/79872110

(2) basename
和dirname作用類似但是相反,basename命令用於去掉文件名的目錄和後綴~

root@juzuodaliyun:/home/test@ basename /home/test/test.sh
test.sh

3. local

顧名思義,local命令用於聲明局部變量,這個命令在shell腳本中一般是在函數內部用來聲明局部邊變量使用

  1. Shell腳本中定義的變量是global的,其作用域從被定義的地方開始,到shell結束或被顯示刪除的地方爲止。
  2. Shell函數定義的變量默認是global的,其作用域從“函數被調用時執行變量定義的地方”開始,到shell結束或被顯示刪除處爲止。函數定義的變量可以被顯示定義成local的,其作用域侷限於函數內。但請注意,函數的參數是local的。
  3. 如果同名,Shell函數定義的local變量會屏蔽腳本定義的global變量
#!/bin/bash
# 聲明函數
func()
{
	local var1;
	local var2:
	……
}
# 調用函數
func

4.export

export:將自定義變量設定爲系統環境變量(僅限於該次登陸操作,當前shell中有效)

所以一般在shell腳本中定義的export變量不用擔心會改變系統中的環境變量設置。

語  法:export [-fnp][變量名稱]=[變量設置值]
補充說明:在shell中執行程序時,shell會提供一組環境變量。export可新增,修改或刪除環境變量,供後續執行的程序使用。
參  數:
-f  代表[變量名稱]中爲函數名稱。
  -n  刪除指定的變量。變量實際上並未刪除,只是不會輸出到後續指令的執行環境中。
  -p  列出所有的shell賦予程序的環境變量。

5. readlink

readlink是linux系統中一個常用工具,主要用來找出符號鏈接所指向的位置。

root@juzuodaliyun:/home/test@ readlink /usr/bin/awk
/etc/alternatives/awk

https://blog.csdn.net/tugangkai/article/details/88563162
https://www.cnblogs.com/chengd/p/7803664.html
https://blog.csdn.net/Jerry_1126/article/details/79872110
http://blog.chinaunix.net/xmlrpc.php?r=blog/article&uid=29631743&id=4408417

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章