Bash
在“if”語句中執行命令並成功執行進一步的步驟
我試圖執行一個程序,該程序將根據提示提供給它的完整路徑創建一個目錄,如果該目錄已經存在,它將返回一個錯誤(對於“目錄已經存在”)並再次詢問遞歸函式中的名稱。
這是我嘗試過的:讓我們說一個文件,
test1
在裡面:#!/bin/bash echo "enter the directory name" read ab check(){ if (( echo `mkdir $ab` 2>/dev/null )); then echo "directory created " echo `ls -ld $ab` exit else echo "try again " echo "enter new value for directory:" read ab check fi } check
這裡的問題是,如果目錄存在,那麼程序可以正常工作,但如果它不存在,那麼它會創建它,然後轉到程序的 else 部分。
迴聲總是成功的。沒有它和子shell:
#!/bin/bash echo "enter the directory name" read ab check(){ if mkdir "$ab" 2>/dev/null; then echo "directory created " ls -ld "$ab" exit else echo "try again " echo "enter new value for directory: " read ab check fi } check
(( echo `mkdir $ab` 2>/dev/null )) bash: ((: echo 2>/dev/null : syntax error in expression (error token is "2>/dev/null ")
雙括號包圍算術表達式。該命令不會執行任何接近您預期的操作。
mkdir $ab
不向標準輸出寫入任何mkdir $ab
內容,空字元串也是如此,所以算術表達式的內容是echo 2>/dev/null
. 這裡的>
符號是“大於”運算符,echo
是一個變數名。算術表達式在語法上是不正確的(你不能有一個變數後跟一個文字整數)。由於該命令在語法上不正確,因此它返回錯誤狀態,並採用else
分支。要測試命令的返回狀態,只需編寫該命令。
if mkdir -- "$ab" 2>/dev/null
附加提示:
- 隱藏命令中的錯誤是個壞主意。使用者需要知道錯誤是否是權限被拒絕、I/O 錯誤等。如果目錄不存在則創建目錄,如果目錄已存在則成功,請使用
mkdir -p -- "$ab"
.- 始終在變數替換周圍使用雙引號。
- 如果 的值
ab
以破折號開頭,它將被解釋為一個選項。把--
第一個標記為選項的結束。