Bash
動態建構命令
我正在編寫一個腳本,我需要
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
有關的: