gnosis of shell 深入理解shell程式設計
阿新 • • 發佈:2020-10-25
- shell中if while等後必須接命令,利用命令的exit code作為判斷,而其他高階語言是利用return值作為判斷
對於非命令變數,可以利用test or [ ] or [[ ]] 進行判斷
如果確實需要用命令或函式的返回值作為判斷,可以如下
function p(){ echo $$ exit 55 } if ! [ `p` ];then echo bbbb else echo pppppppppppp fi
利用命令替換獲取函式p的返回值(由echo提供),而後利用 [ ] 進行判斷
在執行函式p的時候,沒有因為exit 55 退出整個指令碼,而是列印了pppppppp,所以據此判斷shell中命令引用是開闢了一個新的shell程序來執行命令引用,所以命令引用中的exit不會影響到父shellfunction p(){ echo $$ exit 55 } if ! p;then echo bbbb else echo pppppppppppp fi
直接用函式p的exit code : 55進行判斷,但是函式p中包含了exit,結束了當前shell程序,所以整個shell指令碼退出了,故此種方式函式p的執行是在當前shell程序,跟命令引用是不同的
所以改為returnfunction p(){ echo $$ return 55 } if ! p;then echo bbbb else echo pppppppppppp fi
函式返回值沒有變數接收,直接列印了,exit code 為 55 ,取反後,為真
-
直接ps只會顯示當和當前shell關聯的程序和其父程序
-
function b(){ echo $$ exit 55 } echo 'current shell PID: '$$ p=`b` echo echo 'function b PID: '$p echo "ps"
命令引用後在函式b中$$依然為 20933,難道命令引用沒有開闢子shell嗎?
$ 擴充套件為shell的程序ID。在一個()
子shell,它擴充套件為當前shell的程序ID,而不是子shell。
shell中的函式凡是輸出stdout & stderr的都是返回值,也可以利用echo明確返回
看如下例子:function b(){ "ps" exit 55 } echo 'current shell PID: '$$ p="`b`" echo echo -e 'function b ps result: \n'"$p" echo "ps"
明顯看到執行函式b的命令引用時,多出 21476 這個子shell程序,這個時候不能通過變數 $ 進行判斷了