!["configure.ac" の "case" の二重括弧 i[[3456]]86](https://linux33.com/image/11986/%22configure.ac%22%20%E3%81%AE%20%22case%22%20%E3%81%AE%E4%BA%8C%E9%87%8D%E6%8B%AC%E5%BC%A7%20i%5B%5B3456%5D%5D86.png)
次のコードスニペットを理解しようとしています。
host_cpu='i386'
case "$host_cpu" in
i[[3456]]86)
echo "host_cpu=i386"
;;
x86_64)
echo "host_cpu=x86_64"
;;
*)
echo "AC_MSG_ERROR([unsupported CPU type]) "
;;
esac
host_cpu='i386'
コードをテストするために変数を直接追加し、3番目のケースに切り替えましたecho "AC_MSG_ERROR([unsupported CPU type]) "
。
i[[3456]]86)
(表示されているように)二重括弧を単一の括弧に変更すると、i[3456]86)
最初のオプションに切り替わりますi386
。私にとってはこれが正しいようです。
私はこれを理解[
し[[
、これはテストオプションです。スイッチケースでは文字が出力されることが予想されるため、テスト条件はここには適用されないようです。だから私はbashがそれをテスト条件として扱うと[ a < b ]
仮定しています[[ a << b ]]
。これらの Case 文には空白がないため、正規表現として扱われます。そうですか?
だから私の質問は、コードライターがここで角括弧を使用したのはなぜですか?コードを実行しようとするとうまくいきませんが、その意図は何ですか?
configure.ac
注:このコードはGRUBソースコードからインポートされました。
また、 $host_cpu および host_cpu=i386 行は不要なようです。作者がこれをした理由を説明してもらえますか?
AC_CANONICAL_HOST
case "$host_cpu" in
i[[3456]]86) host_cpu=i386 ;;
x86_64) host_cpu=x86_64 ;;
*) AC_MSG_ERROR([unsupported CPU type]) ;;
esac
AC_SUBST(host_cpu)
AC_SUBST(host_vendor)
AC_SUBST($host_cpu) を使うつもりです。なぜこんなことないの?
答え1
これがファイルから来る場合、configure.ac
純粋なシェルスクリプトではありませんが、次のように使用します。M4、[]
引用符の文字はどこにありますか?:
正しい引用の重要性を完全に理解するには、まずAutoconfの特殊文字が何であるかを知る必要があります。 '
#
' はマクロ拡張が行われないコメントを導入し、'',
は引数を区切り、'[
' と']
' は引用符自体です.(
' と ')
' (M4 はペアごとのマッチを試みます)、最後に$
マクロ定義内で '' です。マクロ拡張が可能な場合はいつでも引用拡張があります。つまり、引用レイヤーを剥がすことです。
int tab[10]; ⇒int tab10; [int tab[10];] ⇒int tab[10];
これは[[3456]]
autoconfによって拡張する必要があり[3456]
、これはシェルスクリプトとして使用するための正しい出力になります。