我正在使用 FreeBSD,並且我理解並使用-prune
on 選項find
來防止命令下降到子目錄中。但我發現必要的語法非常笨拙和尷尬。它也不會阻止修剪的目錄本身出現,這是可以修復的,但很煩人。
我想創建一個簡短的腳本/別名,其作用是-noenter
向find
命令添加新的參數如果它是在任何其他初選之前給出的(為了簡單起見)。
目的是我可以輸入以下任一內容:
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
。