Bash

動態建構命令

  • April 22, 2021

我正在編寫一個腳本,我需要tar動態建構命令。

這裡有兩個例子來說明我正在嘗試做的事情:

#!/bin/bash

TAR_ME="/tmp"

EXCLUDE=("/tmp/hello hello" "/tmp/systemd*" "/tmp/Temp*")
_tar="tar "`printf -- '--exclude="%s" ' "${EXCLUDE[@]}"`" -zcf tmp.tar.gz"
echo COMMAND: "${_tar}"
${_tar} "$TAR_ME"

echo -e "\n\nNEXT:\n\n"

EXCLUDE=("--exclude=/tmp/hello\ hello" "--exclude=/tmp/systemd*" "--exclude=/tmp/Temp*")
_tar="tar "`printf -- '%s ' "${EXCLUDE[@]}"`" -zcf test.tar.gz"
echo COMMAND: "${_tar}"
${_tar} "$TAR_ME"

我希望能夠_tar用作命令,我已經能夠使其與經典路徑一起使用,但我需要它與文件夾名稱中的空格一起使用。每次我遇到如下錯誤:

COMMAND: tar --exclude="/tmp/hello hello" --exclude="/tmp/systemd*" --exclude="/tmp/Temp*"  -zcf tmp.tar.gz /tmp
tar: hello": Cannot stat: No such file or directory

COMMAND: tar --exclude=/tmp/hello\ hello --exclude=/tmp/systemd* --exclude=/tmp/Temp*  -zcf test.tar.gz 
tar: hello: Cannot stat: No such file or directory

您只需要知道一件事,我需要我的腳本在非常舊的機器上工作,這意味著我不能使用最後的 bash 功能。

不要嘗試創建可執行字元串。而是在數組中建構參數並在呼叫時使用它tar(您已經正確使用了數組EXCLUDE):

#!/bin/bash

directory=/tmp

exclude=( "hello hello" "systemd*" "Temp*" )

# Now build the list of "--exclude" options from the "exclude" array:
for elem in "${exclude[@]}"; do
   exclude_opts+=( --exclude="$directory/$elem" )
done

# Run tar
tar -cz -f tmp.tar.gz "${exclude_opts[@]}" "$directory"

/bin/sh

#!/bin/sh

directory=/tmp

set -- "hello hello" "systemd*" "Temp*"

# Now build the list of "--exclude" options from the "$@" list
# (overwriting the values in $@ while doing so):
for elem do
   set -- "$@" --exclude="$directory/$elem"
   shift
done

# Run tar
tar -cz -f tmp.tar.gz "$@" "$directory"

注意程式碼中的引用以及程式碼中$@的引用。這可確保列表擴展為單獨引用的元素。sh``${exclude[@]}``${exclude_opts[@]}``bash

有關的:

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