小编oli*_*liv的帖子

如何使用"bash -c"命令使用位置参数?

我想知道使用命令时使用位置参数的最佳方法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命令的第一个位置参数有什么缺点吗?

bash

18
推荐指数
2
解决办法
1640
查看次数

AWK:如果这个是正则表达式,有没有办法将OFS设置为FS?

在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)

regex awk

6
推荐指数
1
解决办法
588
查看次数

在 awk 中测试不存在的变量

我想测试一个可能存在或不存在的变量的值,我正在做:

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

awk

2
推荐指数
1
解决办法
612
查看次数

标签 统计

awk ×2

bash ×1

regex ×1