は?パラメータ拡張時に特別な方法で処理されますか?

は?パラメータ拡張時に特別な方法で処理されますか?

git status --porcelain -bプロンプトで使用するためにfromの出力を解析しようとしていますが、パラメータ拡張を実行すると奇妙な動作が発生します。

このコードは問題を示しています。

#!/bin/bash
IFS=$'\n'
touch ab
status_arr=( $(git status --porcelain -b) )
for (( i=0; i<${#status_arr[@]}; i++ )); do
    echo ${status_arr[$i]}
    echo ${status_arr[$i]:0:2}
done

きれいなgitディレクトリで実行すると、次のような結果が表示されます。

$ bash sandbox/statusline/issue.sh 
## master...origin/master
##
?? ab
ab

??出力の4行目にエコーが表示されることが予想され、実際にスクリプトをまたはtouch abcに変更するとtouch aこれが表示されます。

私はこれについて非常に混乱しており、bashで明白なものを見逃しているようですが、インターネット検索では役に立つものは得られません。

これが既知の「もの」である場合、それを回避するか完全に避ける方法はありますか?

ベストアンサー1

?ファイル名を一致させるために使用されるシェルグローバル文字。単一文字と一致します。したがって、名前のファイルがあるため、abこの??パターンはそのファイルと一致します。

これが起こる理由は、パラメータ拡張がいいえリーダー。

おすすめ記事