20.3 String variables, macros, and command line substitution

文字列変数やバッククォートによる置換、マクロによる置換の相互関係は少し ややこしいです。バッククォートはマクロ置換を妨げないので、


     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

竹野茂治@新潟工科大学
2008年3月11日