2017-01-26 118 views
1

我是Bash腳本編程的新手,儘管多次嘗試重構下面僞代碼中顯示的邏輯結構,我無法獲得此工作。我如何將if/else邏輯與for循環一起分開?Bash腳本 - for循環和if-else

僞代碼: 我有一個命令,用於檢查HDFS文件系統目錄中是否存在任何子文件夾。讓我們調用這個command_A。

If subfolders do NOT exist { 
    proceed with remaining execution of script 
} 
Else { 
    sleep for 30 minutes and run command_A again to see if the subfolders have been removed. Note: This sleep and re-check cycle should repeat up to 4 times and if subfolders are never removed the script is killed with exit 1 
} 

我試過的樣品在下面。我無法弄清楚我應該如何使用||結合else語句。

使用這些結構

1. for i in {1..4}; do command_A && break || sleep 1800; done 
2. if command_A ; then echo "Command succeeded" else echo "Command failed" fi 

試驗例

for i in {1..4}; 
    do 
    if hdfs dfs -test -e $mypath/* 
     echo "Folder is empty" && break 
else 
    ??? 

更新表示工作溶液

for i in {1..4}; 
    do 
    if hdfs dfs -test -e $mypath/*; 
    then 
     if [ $i -eq 4 ] 
     then 
      echo "script exiting now with code 1" 
     else 
      echo "Folder is full" 
      sleep 10 
     fi 
    else 
    echo "Folder is empty" 
    break 
    fi 
done 
+0

爲什麼你需要'爲我在{1..4};'爲?您沒有在任何地方使用'i' – Inian

+0

@Inian我需要重複檢查文件夾在2小時內總共被刪除4次的循環。如果他們從未被刪除,那麼我會退出腳本,因爲我不希望它無限期地運行。 – HendPro12

+0

那麼,只是爲了瞭解什麼是不在這裏工作?或者你錯過了什麼? – Inian

回答

1

UPDATE

這是此特定問題的工作完整的代碼,我會保持原有的較籠統的代碼如下以供將來參考,因爲它是那麼複雜(少嵌套的if/else )爲其他人尋找類似的問題。

for i in {1..4}; 
    do 
    if hdfs dfs -test -e $mypath/*; 
    then 
     if [ $i -eq 4 ] 
     then 
      echo "script exiting now with code 1" 
     else 
      echo "Folder is full" 
      sleep 10 
     fi 
    else 
    echo "Folder is empty" 
    break 
    fi 
done 

我覺得這樣的事情會的工作,這是一個很值得你所擁有的。你只需要把你正在檢查的內容放在if語句中,這段代碼應該適合你。

for i in {1..4} 
do 
    if [ <check for subdirs> ] 
    then 
     echo "Folder is empty!" 
     break 
    else 
     sleep 1800 
    fi 
done 
+1

謝謝!在then和else塊的內容交換中,這是行得通的。以上提供了更新以反映更改。如果你想更新你的迴應匹配。我把它標爲答案。我錯誤地認爲||運算符被要求作爲for循環的一部分,並且不能理解它是如何與if/else並行工作的。 – HendPro12

+0

很高興幫助。你可能一直在想這件事(如果每次我想出一個比所需解決方案更復雜的東西,我只有一美元),或者有時候在範例之間切換會有奇怪的副作用,我們希望將所有的東西結合在一起。我已經用你的工作代碼更新了答案,並且留下了稍微簡化的版本,以便其他人可能不需要做出完全相同的事情。 – SyntheticGio

0

這項工作?

sleep_count=0 
max_attempts=4 
for ((i=0; i < $max_attempts; i++)); do 
    if hdfs dfs -test -e $mypath/*; then 
    echo "No subfolders!" 
    break 
    else 
    # subfolders exist; wait for a while and see if they go away 
    ((sleep_count++)) 
    sleep 1800 
    fi 
done 

if [[ $sleep_count == $max_attempts ]]; then 
    # waited too long for subfolders to go away 
    exit 1 
fi 

# probably repeat the above steps again? 
+1

我已經成功地在終端中作爲獨立命令測試了上述命令。如果檢查顯示第一次執行命令時存在文件夾,那麼我無法弄清楚邏輯結構是否重複檢查3次或4次。 – HendPro12

+0

@Inian bash shell從本地操作系統運行腳本並調用hdfs文件系統命令。不知道這是你問的問題......但它是一個常用的用例來包裝bash shell腳本中的hdfs命令 – HendPro12