Shell

數組作為 tar –exclude 的值

  • December 30, 2021

我想寫一個小備份腳本,但我需要排除一些目錄。所以我決定將我所有的排除目錄設置在這樣的數組中。

exclude[0] = '/home/user/test1'
exclude[1] = '/home/user/test2'
exclude[2] = '/home/user/test3'

是否可以將此數組作為 tar 命令的參數提供?

tar -zcvf $FILE $SOURCE --exclude=exclude

zsh

exclude=(
 /home/user/test1
 /home/user/test2
 /home/user/test3
)
tar  --exclude=$^exclude -zcvf $FILE $SOURCE

$^exclude語法使上述擴展為

tar  --exclude=/home/user/test1 --exclude=/home/user/test2 \
    --exclude=/home/user/test3 -zcvf the-file the-source

預設情況下, rc,esfishshell 對數組進行這種處理,因此在這些 shell 中您可以執行以下操作:

tar  --exclude=$exclude -zcvf $FILE $SOURCE

(用於set exclude /home/user/test1 /home/user/test2 /home/user/test3在 中定義數組fish)。

命令的每個參數都是一個字元串。您不能將數組傳遞給--exclude選項。您需要傳遞多個--exclude選項,或使用其他方法,例如--exclude-from. 一些 shell 有一種巧妙的方法來插入一個數組,每個元素都添加一個前綴,但大多數(sh、bash、ksh、…)沒有。

適用於所有 shell 的一件事是逐步建構命令行。

set -- tar -zcvf "$FILE" 
set -- "$@" --exclude='/home/user/test1'
set -- "$@" --exclude='/home/user/test2'
set -- "$@" --exclude='/home/user/test3'
"$@" "$SOURCE"

如果您使用的是 bash 或 ksh 並且有要排除的模式數組,則可以通過遍歷數組來建構命令行。

exclude=('/home/user/test1' '/home/user/test2' '/home/user/test3')
exclude_options=()
for x in "${exclude[@]}"; do
 exclude_options+=(--exclude="$x")
done
tar -zcvf "$FILE" "${exclude_options[@]}" "$SOURCE"

舊版本的 ksh 和 bash 缺少+=運算符,因此它們需要exclude_options=("${exclude_options[@]}" --exclude="$x")作為循環體。

您可以直接在命名數組變數或位置參數數組中建構命令行,而不是為排除選項建構單獨的數組。

exclude=('/home/user/test1' '/home/user/test2' '/home/user/test3')
set -- tar -zcvf "$FILE"
for x in "${exclude[@]}"; do
 set -- "$@" --exclude="$x"
done
"$@" "$SOURCE"

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