28.3 文字列変数、マクロ、コマンドライン置換 (mixing_macros_backquotes)

文字列変数や逆引用符 (`) による置換、マクロによる置換の相互関係は少し ややこしいです。逆引用符はマクロ置換を妨げないので、


     filename = "mydata.inp"
     lines = ` wc --lines @filename | sed "s/ .*//" `

は、mydata.ipn の行数を整数変数 lines に保存することになります。また、 二重引用符は逆引用符の置換を妨げないので、


     mycomputer = "`uname -n`"

は、システムコマンド uname -n の返す文字列を文字列変数 mycomputer に 保存することになります。

しかし、マクロ置換は二重引用符内では機能しないので、システムコマンドを マクロとして定義してそれをマクロとして利用しかつ逆引用符置換を行なうこ とはでできません。


      machine_id = "uname -n"
      mycomputer = "`@machine_id`"  # うまくいかない !

この失敗は、二重引用符が @machine_id をマクロとして解釈することを妨げ ているからです。システムコマンドをマクロとして保存し、その後それを実行 するには、逆引用符自体もマクロ内に含める必要があります。これは以下のようにマクロを定義することで実現できます。sprintf の書式には 3 種類の引 用符全てが入れ子になっていることに注意してください。


     machine_id = sprintf('"`uname -n`"')
     mycomputer = @machine_id

竹野茂治@新潟工科大学
2020-12-08