修改後的「查找」函數的腳本中的參數處理?

修改後的「查找」函數的腳本中的參數處理?

我正在使用 FreeBSD,並且我理解並使用-pruneon 選項find來防止命令下降到子目錄中。但我發現必要的語法非常笨拙和尷尬。它也不會阻止修剪的目錄本身出現,這是可以修復的,但很煩人。

我想創建一個簡短的腳本/別名,其作用是-noenterfind命令添加新的參數如果它是在任何其他初選之前給出的(為了簡單起見)。

目的是我可以輸入以下任一內容:

  • find -xs /dir -noenter '$*' -name '*.conf' -ls
  • find -x -s /dir -noenter '$*' -name '*.conf' -ls

它會轉換參數並執行:

  • /usr/bin/find -xs /dir \( -name '$*' -prune -or \( -name '*.conf' -and ! \( -type d -and -name '$*' \) \) \) -ls
  • /usr/bin/find -x -s /dir \( SNIPPED \) -ls

但我也可以像平常一樣輸入任何例程“查找”命令,它會透明地將其傳遞給/usr//bin/find執行。

從邏輯上講,腳本需要識別目錄名稱後的第一個參數,然後測試它是否是:

  • ……等於-noenter並後跟至少 2 個以上的參數(在這種情況下,我知道如何/usr/bin/find透過知道哪些參數在它之前/之後來建立我需要傳遞給的參數);或者
  • ....等於-noenter但後面沒有至少 2 個以上參數(= 錯誤);或者
  • ...其他任何內容或 dir 是最後一個參數或未找到(= 將整個原始參數傳遞給/usr/bin/find未更改的)。

我可以做所有這些,除了一件事 - 如何編寫檢查 argv 的腳本部分以判斷哪個 arg 編號(如果有)是參數dir

我選擇的 shell 是sh用於腳本編寫。

答案1

如果您想要測試特定參數的存在和位置,您所需要做的就是解析命令列並測試每個參數是否與您的「預期」值相符。因此,您需要測試每個參數的值-noenter,然後列印一行,說明變數的位置和名稱-noenter

for i in `seq 1 $#`; do
    ref=`eval "echo \\$$i"`
    if [ $ref == '-noenter' ]; then echo "arg $i is $ref"; break; fi
done

現在同樣的事情,只有參數的位置-noenter儲存在 中$mitsos以及之前的參數位置儲存在 中$mary

for i in `seq 1 $#`; do
  ref=`eval "echo \\${$i}"`
  if [ $ref == '-noenter' ]; then
    mitsos=$i
    eva=$(($i-1))
    mary=`eval "echo \\${$eva}"`
    break
  fi
done

現在的$mitsos位置為-noenter或沒有值,並且$mary為 之前的參數的值-noenter。此時,如果有您的$mary/dir知道下一個參數是-noenter,您可以繼續執行find,否則您將使用系統的版本或列印錯誤訊息。最後,如果您不關心 的位置,-noenter可以省略該行mitsos=$i

相關內容