Bash

在“if”語句中執行命令並成功執行進一步的步驟

  • February 4, 2019

我試圖執行一個程序,該程序將根據提示提供給它的完整路徑創建一個目錄,如果該目錄已經存在,它將返回一個錯誤(對於“目錄已經存在”)並再次詢問遞歸函式中的名稱。

這是我嘗試過的:讓我們說一個文件,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以破折號開頭,它將被解釋為一個選項。把--第一個標記為選項的結束。

引用自:https://unix.stackexchange.com/questions/175904