[原创]脚本小技巧:awk变量传递到shell变量

[序言] 最近在忙着复习shell脚本语言, 一共花费了10天. 这次要写真正意义的shell脚本程序, 因此这次复习不可马虎.

[遇到的麻烦] 在写shell脚本代码的时候, 会发现awk很好用, 它的语法避开了很多shell语法的坑. 所以我尝试大规模的代码全在awk里面, 少量代码在shell里面. 但在开发过程中, 遇到一个小麻烦: 在非单行程序中, awk变量如何传递给shell使用呢? 经过2天的测试和反复阅读awk和shell的书籍, 正确写出了演示代码:

[在非单行awk引用单行shell/多行shell的优势] 1> 可以专注awk的简单语法, 避免各种带有坑的shell语法 2> 在awk环境下, 可执行单行shell/多行shell命令, 这样可以适当发挥shell大量内置命令或者外部命令的优势

[awk变量传递给单行shll的代码演示]

#awk的BEGIN区域
#在awk下执行单行shell代码. 注意 语法是 { sh2ll代码1; shell代码2; shell代码3; }
BEGIN {

    #演示作用: awk的变量为var_for_awk, 通过awk的管道传递给单行shell, 在shell内使用read命令接受并保存到var_get_awk变量 
    var_read_cml = "var_get_awk; printf "$var_get_awk
"; } "
    var_read_cml_full = "{ read " var_read_cml
    var_for_awk = "Hello world
" 
    printf var_for_awk | ("{ read " var_read_cml)
    close("{ read " var_read_cml)

}

[awk变量传递给多行shll的代码演示]

#在awk下执行单行shell代码. 注意 语法是
# sh2ll代码1

# shell代码2

# shell代码3


BEGIN {

    #演示作用: awk的变量为var_for_awk, 通过awk的管道传递给多行shell, 在shell内使用read命令接受并保存到var_get_awk变量 
    var_read_cml = "var_get_awk
"
                   "printf "$var_get_awk
"
"
                   "printf "shell end...
""
    var_read_cml_full = "read " var_read_cml
    var_for_awk = "Hello world
" 
    printf var_for_awk | ("read " var_read_cml)
    close("read " var_read_cml)

}

[以上代码需要注意的细节] 1> 记得使用close关闭已经打开的管道, 否则awk的BEGIN模块和END模块无法进行同步处理, 也就是说BEGIN模块没有运行完成, 则END模块已经启动了.

[结尾] 希望这个小代码技巧对喜欢shell脚本的程序员有所帮助.

经验分享 程序员 微信小程序 职场和发展