パス名にスペースがあるコマンドラインbashスクリプトの作成

パス名にスペースがあるコマンドラインbashスクリプトの作成

gccを呼び出すには単純なスクリプトが必要ですが、パスにスペースがあるディレクトリに渡す必要があるライブラリのリストがたくさんあります。

私のスクリプトをテストするには、gccの代わりに次のコマンドを使用します。

#!/bin/bash
for var in "$@"
do
    echo "$var"
done

私が試した多くの試みの1つは次のとおりです。

#!/bin/bash
LIBDIR="lib dir"
LIBS=
LIBS+="lib1 "
LIBS+="lib2 "
CMD="./debug.sh "
for LIB in $LIBS
do
    CMD+="-I ${LIBDIR}/${LIB} " 
done
${CMD}
exit

明らかに問題は、bashが引数を区切るために使用されるスペースとそうでないスペースを区別できないことです。しかし、引用符やバックスラッシュをどのように配置しても、いくつかのスペースを「引用」し、他のスペースは「引用」する方法を知ることはできません。

ベストアンサー1

特定のケースの場合:

#!/bin/bash
LIBDIR="lib dir"
LIBS=("lib1" "lib2")
CMD=(./debug.sh)
for LIB in "${LIBS[@]}"
do
    CMD+=(-I "${LIBDIR}/${LIB}")
done
"${CMD[@]}"
exit

LIBS2つの配列、つまりライブラリ名とCMDコマンド自体が使用されます。この方法は、次のような場合でも機能します。その他余分なスペース。+=(...)新しい文字列を文字列の末尾に連結するのと同じように、新しい項目を配列の末尾に連結します。"${CMD[@]}"配列のすべての値に展開されます。別の言葉で(スペースで区切らない)スペースやその他の特殊文字が原因でシェルスクリプトが停止するのはなぜですか?このトピックに関する一般的な内容がたくさんあります。変数に保存されたコマンドをどのように実行できますか?具体的に。

おすすめ記事