スペースを含む文字列を読み取る Bash スクリプト

スペースを含む文字列を読み取る Bash スクリプト

一度に複数のブランチに自動的にgit pushを実行する高速bashスクリプトを作成しようとしています。私の問題は、コミットメッセージを読み取り変数として入力すると、bashとgitが空白のために狂ってしまうことです。

これは私の現在のスクリプトです。

    #!/bin/bash
echo "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"
echo "Pushing To all branches"
echo "What is your Commit Message?"
read message

git add *
git commit -m \"$message\"
git push origin
.... (push to other branches) ...

echo "Done!"
echo "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"

私のコミットメッセージに1つの単語があれば完璧に動作します。しかし、これは事実ではないことが多いです。たとえば、次のように入力すると:

Testing test case

私のコミットメッセージに次のエラーが表示されます。

error: pathspec 'test"' did not match any file(s) known to git.
error: pathspec 'case"' did not match any file(s) known to git.

私のbashスクリプトがスペースを処理できるようにこの問題を解決する方法を知っている人はいますか?

とても感謝しています!

ベストアンサー1

主な問題は、git commit -m通話メッセージに二重引用符を使用することです。

与えられたコマンドラインは文字列のgit場合は次のようになります。$messagesome message here

git commit -m '"some' 'message' 'here"'

これは二重引用符によるものです。

代わりに、次のように動作します。

git commit -m "$message"

コミットメッセージテンプレートを使用してください。

ファイル内のテンプレートが次のと仮定しますtemplate.txt

# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# Pushing To all branches
# What is your Commit Message?

...これにより、エディタのコミットメッセージの上部にこの内容が挿入されます。

git commit -t template.txt

コミットメッセージを編集できるエディタを提供すると、ユーザーが正しいコミットメッセージの形式を適切に指定するのが簡単になります。

また、使用するテンプレートファイルのパス名をcommit.templateリポジトリファイル.git/configに設定することもできます(-t現在は必要ありません)。

テンプレートから次から始まる行はすべて#送信されません。

また見なさい:

おすすめ記事