コマンドパラメータのシェル文字列エスケープ

コマンドパラメータのシェル文字列エスケープ

次のコマンドを使用して「/tmp/pwet/foo bar」を生成しようとしています。

DIR="/tmp/pwet/foo bar"
ARGS="-p ${DIR}"
mkdir $ARGS

統合上の理由から、ARGSを2段階で構築する必要がありました。 ARG = some_options + $DIR このコードは/tmp/pwet/foo2 つのディレクトリを生成します./bar。これは私が望むものではありません。

私は多くの脱出を試みたが、役に立たなかった。 bashを使用してスクリプトを実行します。良い解決策は何ですか?

答え1

問題は変数の内容にあるのではなく(これができるだけ多くのエスケープ文字を使用しようとする理由です)、bashを使用して$ARGS変数の内容を文字通り置き換えるので、その中の空白はコマンドの実際の空白になります。

ただ使用してくださいmkdir "$ARGS"(つまり、変数参照を"sで囲みます)

-p更新:コメントで説明したように、およびその他のオプションがディレクトリ名の一部にならないようにするには、2つの変数を定義します。

OPTS="-p -whatever"そして ARGS="/tmp/pwet/foo bar"

次に、後で次のようにmkdirを発行します。

mkdir $OPTS "$ARGS"

あるいは、エスケープ文字を使用して完全な制御権を持ち、複数のディレクトリを持つことができ、一部は空白を持ち、一部はオプションを持たず、すべて混在している場合は、コマンド全体を変数に入れ、bash -c itを使用して実行できます。 。

試すことができるタスクの開始点として、以下の例を確認してください。

MKDIRCMD="mkdir -p \"A B\" \"C D\""
echo $MKDIRCMD # Notice the \ characters are NOT part of the string
bash -c "$MKDIRCMD"

関連情報