bashシェルスクリプトで、bashdo-for.sh
を使用してglobで指定されたすべてのディレクトリ内でコマンドを実行したいと思います。これは何度も答えられていますが、コマンドラインでコマンド自体を提供したいと思います。言い換えれば、私がディレクトリを持っていると仮定します:
foo
bar
入りたい
do-for * pwd
そして、bashに作業ディレクトリを内部にfoo
、次に内部に出力させbar
ます。
ウェブ上でたくさんの答えを読んだことから、私はこれができると思いました:
for dir in $1; do
pushd ${dir}
$2 $3 $4 $5 $6 $7 $8 $9
popd
done
どうやらglob*
は他のコマンドライン引数変数に展開されますが!だから、ループを初めて通過したとき、$2 $3 $4 $5 $6 $7 $8 $9
私は期待してfoo pwd
いましたが、代わりに私は得たようfoo bar
です!
コマンドラインのglobが他のパラメーターに展開されないようにするにはどうすればよいですか?または、これにアプローチするためのより良い方法はありますか?
これを明確にするために、バッチファイルの使用方法を次に示します。(ちなみに、これはWindowsバッチファイルバージョンでは正常に機能します。)
./do-for.sh repo-* git commit -a -m "Added new files."
私はあなたがあなたのユーザーにそのようなある種のセパレーターを提供しなければならないことにオープンであると仮定します
./do-for.sh repo-* -- git commit -a -m "Added new files."
スクリプトは次のようなことを行うことができます(これは概念を説明するためのものであり、実際のコードはテストしていません):
CURRENT_DIR="$PWD"
declare -a FILES=()
for ARG in "$@"
do
[[ "$ARG" != "--" ]] || break
FILES+=("$ARG")
shift
done
if
[[ "${1-}" = "--" ]]
then
shift
else
echo "You must terminate the file list with -- to separate it from the command"
(return, exit, whatever you prefer to stop the script/function)
fi
この時点で、すべてのターゲットファイルが配列に含まれており、「$ @」には実行するコマンドのみが含まれています。あとは:
for FILE in "${FILES[@]-}"
do
cd "$FILE"
"$@"
cd "$CURRENT_DIR"
done
このソリューションには、ユーザーが「-」区切り文字を忘れた場合に通知されるという利点があることに注意してください(引用による失敗ではありません)。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加