スクリプト内で、スペースを含む文字列をコマンドライン引数として渡します。

スクリプト内で、スペースを含む文字列をコマンドライン引数として渡します。

Macではbashシェルを使用しています。

実行できるようにシェルスクリプト "gac"を作成したい

> gac one two three

生産する正確に走るような効果

> git add .
> git commit -m "one two three"

これまで私のスクリプトは次のようになりました。

function gac() {
    git add .
    concatenated="'$*'"
    git commit -m "$concatenated"
}

シェルパラメータをスペースで区切られた単一の文字列(スクリプトの2行目)にリンクする方法を見つけました。ここ。上記のスクリプトは、ログメッセージの読み取りを除いてほとんど機能します。

a382806 'one two three'

代わりにシェルスクリプトを使用する場合

a382806 one two three

手動で入力すると

> git commit -m "one two three"

コマンドラインから。

どんなアイデアがありますか?

ベストアンサー1

配置するとき二重引用符拡張、そんなパラメータ拡張 $*、拡張テキストは次の影響を受けません。噴射。 (これが拡張の周りに二重引用符を使用する理由の1つです$。もう1つの理由は次のとおりです。ワイルドカード.)また二重引用符の中にアポストロフィ特に扱いませんので参考にしておらず、削除済み

だからマイケル・ホーマー、それでもやります。' 'のフラグを省略するあなたの機能は動作するはずです。次のように書くことをお勧めします。

gac() {
    git add .
    git commit -m "$*"
}

キーワードを使用してfunctionBashで関数を定義できますが、上記の構文はBourneスタイルのシェル全体で同じように有効で移植可能です。


ここで概念的な問題をより直接的に解決するために、元のコードのこの行は、値にスペースを含むパラメータを拡張して、それを単一のパラメータとして次に渡すことができることを示していますgit

    concatenated="'$*'"

スペースを含む単一の引数を直接作成する場合は、通常、文字列全体を引用符で囲んでスペースを引用する必要があります。存在感' ' ~へその" "行には、通常、入力する引用符を含めようとするという意味です。

この方法ができない理由はシェル自体は引用符を解釈します。通常、シェルで実行するコマンドには意味がありません。。次のコマンドがあるとしましょう。

some-command 'foo bar' baz

このコマンドは実際にコマンドに引用符を渡しませんsome-command。代わりに、次のようsome-commandに実行されます。foo barディスカッション1とbazパラメータ2。(プログラムの実行方法を示す引数0もあります。シェルはsome-commandそれを渡します。)

引用符を使用すると、次のことができます。シェルに言う議論が始まり終わるところ。スペースは通常、シェルに各側のテキストを別々の引数として扱うように指示します。1しかし、引用が行うのと同じシェルに対する空白の特別な意味を抑制しようとしています。 inside ' 'inside のように引用符が引用されると" "削除されます。彼ら特別な意味もあります。次に、引用符を実行する代わりに、gitログに表示されているとおりに文字通り渡されたコマンドを使用します。

a382806 'one two three'

1 シェル動作中、スペース、タブは互いに関連していますが、2つの異なる方法でテキストを別々の単語に分割します。まず、コマンドが初めて解析されるとき、引用符で囲まれていないスペース、タブは語彙タグを区別します。その他メタ文字これも可能ですが、追加の効果があります。たとえば、1;行を複数のコマンドに分割します。 2. どこでパラメータ拡張または他のものシェル拡張で表される$2引用符のないコンテキストで実行されると、結果はすぐに影響を受けます。噴射、どちら文字を$IFS区切り文字として使用。これデフォルトIFSスペース、タブ、改行文字が順番に来ます。

2またはコマンドの置き換え、構文` `の代わりに構文を使用する場合も同様です$( )

おすすめ記事