我想知道使用命令时使用位置参数的最佳方法bash -c.
手册页指示-c选项:
如果在command_string之后有参数,则将它们分配给位置参数,从$ 0开始.
所以我想以下表格是正确的:
$ bash -c 'printf "%s %s %s\n" $0 $1 $2' param1 param2 param3
param1 param2 param3
Run Code Online (Sandbox Code Playgroud)
但是我看到了以下形式,我想知道为什么会更好
$ bash -c 'printf "%s %s %s\n" $1 $2' _ param1 param2
param1 param2
Run Code Online (Sandbox Code Playgroud)
在这种情况下,角色会_替换$0.
我知道,对于许多解释器来说$0有一个特殊的含义(命令名称,所有位置参数......),但在这种情况下,手册页非常清楚.
那么,第一种形式是否有问题,并且使用$0作为bash -c命令的第一个位置参数有什么缺点吗?
在awk中,字段(或记录)分隔符FS(或RS)可以设置为正则表达式.它非常适合获取任何单个字段,但是一旦设置了这些字段,字段分隔符就会"消失".
echo "a|b-c|d" | awk 'BEGIN{FS="[|-]"} {$3="z"}1'
a b z d
Run Code Online (Sandbox Code Playgroud)
在这种情况下,输出字段分隔符OFS默认设置为空格.
不幸的是,这种语句OFS=FS="[|-]"不起作用,因为它设置OFS为一个字符串.
我知道如果有多个选择,awk选择输出字段分隔符可能会变得棘手,但是如果没有新字段,则可以保留当前的字段.
那么,有没有一种简单的方法可以设置OFS为完全相同的正则表达式FS,这样我得到了这个?
echo "a|b-c|d" | awk '... {$3="z"}1'
a|b-z|d
Run Code Online (Sandbox Code Playgroud)
或者,有没有办法捕获数组中的所有分隔符?
同样的问题也适用于记录分隔符RS(及其相关ORS)
我想测试一个可能存在或不存在的变量的值,我正在做:
if(a<1) print "fail"
Run Code Online (Sandbox Code Playgroud)
这很好用。
如果我然后重新测试相同的变量并且如果这个变量没有被设置,awk将会看到这个变量被设置。
$ awk 'BEGIN{if(a<1) print "fail"; if(a) print "fail"; }'
fail
Run Code Online (Sandbox Code Playgroud)
在上面的语句中,我希望不会打印任何内容,因为变量a从未设置为任何内容。
你有什么解释为什么会有这样的行为吗?
如果这很重要,我正在使用 GNU Awk 4.2.1