Shell
數組作為 tar –exclude 的值
我想寫一個小備份腳本,但我需要排除一些目錄。所以我決定將我所有的排除目錄設置在這樣的數組中。
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
,es
和fish
shell 對數組進行這種處理,因此在這些 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"