動的ビルドコマンド

動的ビルドコマンド

スクリプトを作成していますが、tarコマンドを動的に作成する必要があります。

以下は、私がやろうとしていることを説明する2つの例です。

#!/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

あなたが知っておくべきことの1つは、非常に古いコンピュータでスクリプトを実行するためにスクリプトが必要であることです。つまり、最新のbash機能が利用できないという意味です。

ベストアンサー1

実行可能な文字列を作成しようとしないでください。代わりに、配列にパラメータを作成して呼び出すときにそれを使用してください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

関連:

おすすめ記事