Bash

在bash中為外部命令建構可變長度參數行的正確方法

  • May 16, 2018

我需要使用“查找”命令在我的 Bash 函式中查找幾組不同的文件,具體取決於我的腳本輸入。

所以,我有這樣的事情:

DAYS=30
case $1 in
A1) ARGLINE="-name 'FOO*.xml' -or -name 'BAR*.xml' -or -name 'BTT*.txt'"
   ;;
A2) ARGLINE="-name 'PO*xml' -or -name 'PR*xml'"
   ;;
...
esac
find . -maxdepth 1 -type f -mtime +${DAYS} `${ARGLINE}`

這行得通。

但是,只要我想使用變數搜尋天數,就像這樣:

DAYS=30
case $1 in
A1) ARGLINE="-name 'FOO*.xml' -or -name 'BAR*.xml' -or -name 'BTT*.txt'"
   ;;
A2) ARGLINE="-name 'PO*xml' -or -name 'PR*xml'"
   ;;
...
esac
if [[ $# -gt 1 ]]; then
   DAYS=$2
fi
find . -maxdepth 1 -type f -mtime +${DAYS} `${ARGLINE}`

find沒有找到任何匹配的文件時,該函式失敗,並出現以下錯誤:

找不到命令“-name”,您的意思是:來自包“coreutils”(主)的命令“uname”-name:找不到命令

但是,當 find 找到一些文件的天數時,它可以正常工作。當我嘗試將成功執行的輸出通過管道傳輸到另一個命令時,它也會失敗。

我應該如何正確建構“查找”的參數行?

bash中,使用數組:

args=( '(' -name 'FOO*.xml' -or -name 'BAR*.xml' -or -name 'BTT*.txt' ')' )

額外的括號用於創建正確的布爾邏輯分組,因為您使用-or)。

然後,在find命令中:

find ...some arguments... "${args[@]}"

你有一個額外的問題,你使用

`$ARGLINE`

這是一個命令替換,類似於$( $ARGLINE )shell 將嘗試將$ARGLINE(其值)作為命令執行。這就是為什麼你得到“找不到命令’-name’”的原因。命令替換失敗,但find執行,這就是你認為它“有效”的原因。

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