起きたこと
「01 3955」のような「番号 ID」の組を回すループを、bash の書き方で zsh のターミナルに打ちました。set -- $p で $1・$2 に分けるつもりが、$1 に「01 3955」が丸ごと入り、存在しないファイル名「01 3955.current.html」ができました。
再現の手順
$ zsh -c 'p="01 3955"; set -- $p; echo "zsh: 引数 $# 個 / 1つ目=[$1]"; set -- ${=p}; echo "zsh \${=p}: $# 個"'
zsh: 引数 1 個 / 1つ目=[01 3955]
zsh ${=p}: 2 個
$ bash -c 'p="01 3955"; set -- $p; echo "bash: 引数 $# 個"'
bash: 引数 2 個原因
zsh は、引用符で囲んでいない変数を空白で分けません(bash や sh と違う、zsh の決まり。SH_WORD_SPLIT を設定すると bash と同じになる)。Mac のターミナルの標準は zsh なので、bash 向けに書いた1行をそのまま貼ると起きます。
直し方
- zsh で分けるときは
${=p}と書く - bash 向けの書き方を使う部分は、
bash -c '…'やスクリプトのファイルにして bash で動かす - 組を回すなら、分けずに配列を2つ使う方が、どちらのシェルでも読み違えない
確かめたこと
上の再現の手順を macOS 26.6 の zsh 5.9 と bash 5.2.37 で動かし、出力のとおりになりました。同じループを bash -c の中で動かすと、正しく分かれました。