awk
-v
提供了一种使用标志(例如)将命名变量传递到脚本的便捷方法awk -v var="value" ...
,这种工具在编写临时脚本时非常有用。使用 Perl 可以完成同样的操作吗?或者是否需要通过 shell 通过适当的引用等进行插值argv
?该选项可以提供所需的效果,但仅限于布尔值。getopts
%ENV
-s
答案1
感谢您meuh
指出使用该-s
选项来传递任意数据,而不是简单地切换开关;经过进一步调查,单行使用该-s
选项的正确语法如下:
$ perl -se 'print "xyz=$xyz\n"' -- -xyz="abc"
xyz=abc
答案2
下面演示了从命令行读取类似 awk 的变量赋值以及在 shell 脚本中接受内联 perl 代码:
# cat test.sh
perl - FS=':' GRP='50' <<'EOF'
eval '$'.$1.'$2;' while $ARGV[0] =~ /^([A-Za-z_0-9]+=)(.*)/ && shift;
print "$FS\n";
print "$GRP\n";
EOF
这是证明:
# sh test.sh
:
50
这是OP答案的另一种形式,它接受内联、多行perl代码:
# cat test.sh
perl -s -- - -xyz="abc" <<'EOF'
print "xyz=$xyz\n";
EOF
以及证明:
# sh xyz.sh
xyz=abc
这种格式看起来与 shell 脚本中编写的非常相似,并且可以轻松地用生成的代码awk
替换翻译的重要awk
代码,而无需将代码放在单独的文件中。a2p
perl