引用符付きのbashスクリプト解析引数


8

testという名前のこの単純なスクリプトを検討してください。

#!/bin/bash
echo $1

次のコマンドと呼び出し:

$ echo "A B"
A B
$ echo ""A B""
A B
$ echo """A B"""
A B
$ echo """A B"""
A B

$ ./test "A B"
A B
$ ./test ""A B""
A
$ ./test """A B"""
A B
$ ./test """"A B""""
A

テストの呼び出しがコマンドエコーのように動作しない、または関連するドキュメントをポイントしない理由を誰かが説明してもらえますか?


2
すでにテストコマンドがあります。フルパスを使用していたのは幸運です。それ以外の場合は、状況のデバッグに苦労しました。
Rui F Ribeiro

3
この種のテストの場合は、printf '%q\n' "$@"代わりにを使用する方が良いです。これによりecho、非表示の文字と空白が目に見える形式でエスケープされた状態で引数が1行ずつ出力されます。
Charles Duffy

回答:


13

のでecho連結し、すべてのそれの引数は、それらを印刷し、そしてあなたのスクリプトがこれらに限定されている最初の引数。スクリプトでは使用"$@"しない$1でください。

テストに提供する引数を見てみましょう。

  • ./test "A B"
    • 1つの引数、3文字の文字列 AspaceB
  • ./test ""A B""
    • 2つの引数
      • 最初に、とempty string連結A
      • 第二に、とB連結empty string
  • ./test """A B"""
    • empty stringAspaceB連結された1つの引数empty string
  • ./test """"A B""""
    • 2つの引数
      • 最初に、empty stringempty string連結A
      • 第二に、Bempty string連結empty string

注:echo引数に複数のスペースを使用した場合とは結果が異なります。これは、echoが引数を単一のスペースで連結するためです。

$ echo "A   B"
A   B
$ echo ""A   B""
A B
$ echo """A   B"""
A   B
$ echo """"A   B""""
A B

それらはきちんとした小さな空の文字列の奇妙なものです。
mikeserv

2
正確には、引用符は入れ子になりません...
mr.spuratic
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.