使用bash变量作为文件参数

时间:2019-05-11 21:39:44

标签: bash

在bash中,是否有比将进程替换和echo -n传递变量作为文件参数更好的方法?

v1='...'
v2='...'
comm <(echo -n "$v1") <(echo -n "$v2")

以下内容适用于一个文件参数,但会增加一些可读性:

comm <(echo -n "$v1") - <<<"$v2"

也许更快一点?是否有2个以上文件的更好选择?基本上,我正在寻找v1=$(<filename)的反义词。

2 个答案:

答案 0 :(得分:1)

$ v1=$(seq 1 3); v2=$(seq 2 4)

$ comm /dev/fd/3 3<<<"$v1" /dev/fd/4 4<<<"$v2"
1
                2
                3
        4

在上面的3<<<"$v1"4<<<"$v2"中,文件描述符3和4指向由<<<生成的临时文件,然后在这些文件描述符上运行comm 。使用awk,您可以看到发生这种情况:

$ awk 'BEGIN{for (i in ARGV) print i, ARGV[i]} {print FILENAME, $0}' /dev/fd/3 3<<<"$v1" /dev/fd/4 4<<<"$v2" 
0 awk
1 /dev/fd/3
2 /dev/fd/4
/dev/fd/3 1
/dev/fd/3 2
/dev/fd/3 3
/dev/fd/4 2
/dev/fd/4 3
/dev/fd/4 4

如果您发现其他更易读的排列并且可以继续进行,则可以更改FD分配与用法的命令行顺序,例如:

$ v3=$(seq 4 6); v4=$(seq 6 8)

$ paste /dev/fd/3 3<<<"$v1" /dev/fd/4 4<<<"$v2" /dev/fd/5 5<<<"$v3" /dev/fd/6 6<<<"$v4"
1       2       4       6
2       3       5       7
3       4       6       8

但是您应该真正质疑为什么要这样做,如果您发现自己正在考虑这样做的话,那么有什么更好的方法可以解决您真正需要做的事情。

有关更多信息,请参见https://unix.stackexchange.com/a/148153/133219

答案 1 :(得分:0)

我可能听不懂,但看来您想得太过分了。

awk '{print $2}' "$v1" "$v2"

如果{v1}和{v2}不是文件名,而是数据,则可以使用heredoc:

awk '{print $2}' <<EOF
$v1
$v2
EOF

或此处字符串:

awk '{print $2}' RS=: <<< "$v1:$v2"