コマンドプロンプトで文字列に引用符を使用する際の注意点

記事タイトルとURLをコピーする

はじめに

コマンドプロンプトで、AWS CLIを利用した際に発生したエラーについて調べたことをまとめます。

起きたエラーと経緯について

例 3: Amazon Kinesis Data Firehose を使用したサブスクリプションフィルターの設定を行っており、コマンドサンプルを修正して実行しました。

  • コマンドサンプル(抜粋)
aws s3api get-object --bucket 'my-bucket' --key 'firehose/2015/10/29/00/my-delivery-stream-2015-10-29-00-01-21-a188030a-62d2-49e6-b7c2-b11f1a7ba250' testfile.gz

コマンドサンプルのシングルクォート内を実際の値に修正し、コマンドプロンプトで実行したところ、以下のようなエラーが発生しました。

バケット名やファイル名はテスト用に短くしています。

C:\work>aws s3api get-object --bucket 'testbucket210728' --key 'sample.txt' outfile.txt

Parameter validation failed:
Invalid bucket name "'testbucket210728'": Bucket name must match the regex "^[a-zA-Z0-9.\-_]{1,255}$" or be an ARN matching the regex "^arn:(aws).*:(s3|s3-object-lambda):[a-z\-0-9]+:[0-9]{12}:accesspoint[/:][a-zA-Z0-9\-]{1,63}$|^arn:(aws).*:s3-outposts:[a-z\-0-9]+:[0-9]{12}:outpost[/:][a-zA-Z0-9\-]{1,63}[/:]accesspoint[/:][a-zA-Z0-9\-]{1,63}$"

エラーメッセージについて

Invalid bucket name "'testbucket210728'"
  1. 不正なバケット名であることを指摘されています。この時点でバケット名の誤りがないかチェックしましたが、問題ありませんでした。

  2. よく見ると、バケット名がシングルクォートとダブルクォートの両方で囲われていることに気づきます。そのため「'testbucket210728'」というバケット名が不正ということになります。

エラーの原因

  • コマンドプロンプトでは文字列を引用符で囲む際にシングルクォートが使えないことがわかりました。

    • そのため今回はシングルクォートも含めてバケット名として扱われました。
  • ユーザガイドには引用符にダブルクォートを利用する旨の記載があります。

ダブルクォートへ修正後のコマンド結果

  • 想定通りに動作することを確認できました。
C:\work>aws s3api get-object --bucket "testbucket210728" --key "sample.txt" outfile.txt
{
    "AcceptRanges": "bytes",
    "LastModified": "2021-07-28T09:39:12+00:00",
    "ContentLength": 6,
    "ETag": "\"5e8ff9bf55ba3508199d22e984129be6\"",
    "ContentType": "text/plain",
    "Metadata": {}
}

まとめ

普段Linux系をメインで利用しているため、コマンドプロンプトでは引用符としてシングルクォートを利用できないことを知るきっかけとなりました。

Windows PowerShellでは引用符としてシングルクォートを利用可能です。

ユーザガイドでは項目によって文字列の引用符が統一されていないことがあるため、エラーが起こった際はサンプルの引用符についても確認してみてはいかがでしょうか?