Mac のターミナル(zsh)で "$ID:w" の :w が消える:変数の後ろの「:」は加工の記号

Mac のターミナル(zsh)で "$ID:wrong-password" を curl に渡したら、ID の後ろが ong-password になりました。zsh では、変数名のすぐ後ろの :w や :r が修飾子(modifier。変数を加工する記号)として読まれます。${ID} のように { } で囲むと防げます。

「"$ID:w" の :w が消える」の文字と、zsh・${ID} で囲むの札

Mac のターミナル(zsh)で、変数のすぐ後ろに「:」を書いたら、文字の一部が消えました。原因は、zsh では変数名のすぐ後ろの「:」と1文字が、修飾子(modifier。変数の中身を加工する記号)として読まれることでした。変数名を ${ID} のように { } で囲めば防げます。

zsh で、変数の後ろの「:w」が消えた

確認用のサイトで、間違ったパスワードでは開けないことを確かめようとしました。ID を変数に入れ、パスワードの代わりに wrong-password を付けて、curl に渡しました。

Macで実行
ID=(本物の ID)
curl -s -o /dev/null -w '%{http_code}\n' -u "$ID:wrong-password" https://staging.example.com/
ターミナルの再現。"$ID:wrong-password" では ID の後ろが ong-password になり、"${ID}:wrong-password" では正しく :wrong-password が残る
zsh で変数の後ろに「:」を書くと文字が消える

原因::w と :r は、変数を加工する記号

zsh では、$変数名 のすぐ後ろに「:」と決まった1文字を書くと、変数の中身を加工する記号(修飾子)として読まれます。たとえば :r は「拡張子を取り除く」、:h は「最後の / より前を残す」といった意味です。

オレンジ色の背景に置かれた、はさみの写真
「:w」の部分だけが、切り取られて消えた(イメージ写真)

"$ID:wrong-password" では、:w と :r が加工の記号として読まれて消え、残った ong-password が、加工した ID の後ろにくっついていました。

"$ID:w" と書くと :w が変数を加工する記号として読まれて消える。"${ID}:w" と { } で囲むと :w がそのまま残る
変数名を { } で囲む
変数の後ろの「:」と1文字が加工の記号として読まれることを示す表と、{ } で囲んだ書き方との比較
加工の記号の例と、直し方

直し方:変数名を { } で囲む

zsh で変数名を { } で囲むと、変数名がそこで終わるので後ろの「:」はただの文字として扱われ、"${ID}:wrong-password" が正しく送られる
変数の後ろに文字が続く時は、いつも { } で囲む
金属の枠でできた、アルファベットの文字が散らばった写真
変数名は、{ } で囲んではっきり区切る(イメージ写真)

まとめ

Mac のターミナル(zsh)で "$ID:w" の :w が消える:変数の後ろの「:」は加工の記号:要点のまとめ。zsh では、$変数名 のすぐ後ろの「:」と1文字が、変数を加工する記号として読まれる
この記事の要点
  • zsh では、$変数名 のすぐ後ろの「:」と1文字が、変数を加工する記号として読まれる
  • "$ID:wrong-password" では :w と :r が消え、ID の後ろに ong-password がくっついた
  • "${ID}:wrong-password" のように { } で囲めば防げる

この記事は、AI(Claude)の支援を受けて作成し、筆者が内容を確認しています。

  • zsh
  • Mac
  • ターミナル
  • シェル
  • curl
  • 変数

関連する記事

この記事に関連するサービス・アプリ

ブログの一覧へ