在另一个bash命令中使用多个bash变量

在另一个bash命令中使用多个bash变量,bash,shell,Bash,Shell,我试图在另一个命令中使用两个变量。比如说, var1=$(ls | grep "foo") var2=$(ls | grep "bar") common=$(comm -1 -2 <($var1) <($var2)) echo "$common" var1=$(ls | grep“foo”) var2=$(ls | grep“bar”) common=$(comm-1-2忽略解析ls和将命令存储在变量中的问题,您希望在两个变量中包含实际命令,而不是命令的结果 var1='ls

我试图在另一个命令中使用两个变量。比如说,

var1=$(ls | grep "foo")
var2=$(ls | grep "bar")
common=$(comm -1 -2 <($var1) <($var2))

echo "$common" 
var1=$(ls | grep“foo”)
var2=$(ls | grep“bar”)

common=$(comm-1-2忽略解析
ls
和将命令存储在变量中的问题,您希望在两个变量中包含实际命令,而不是命令的结果

var1='ls | grep foo'
var2='ls | grep bar'
common=$(comm -1 -2 <($var1) <($var))

忽略解析
ls
和将命令存储在变量中的问题,您希望在两个变量中使用实际命令,而不是命令的结果

var1='ls | grep foo'
var2='ls | grep bar'
common=$(comm -1 -2 <($var1) <($var))

Bash变量是字符串,而不是延迟计算的表达式。如果您想要稍后可以计算的内容,请使用函数

var1() { ls | grep "foo"; }
var2() { ls | grep "bar"; }
common=$(comm -1 -2 <(var1) <(var2))
var1(){ls | grep“foo”;}
var2(){ls | grep“bar”;}

common=$(comm-1-2Bash变量是字符串,而不是延迟计算的表达式。如果您想要稍后可以计算的内容,请使用函数

var1() { ls | grep "foo"; }
var2() { ls | grep "bar"; }
common=$(comm -1 -2 <(var1) <(var2))
var1(){ls | grep“foo”;}
var2(){ls | grep“bar”;}

common=$(comm-1-2
对原始版本的最小修改如下:

var1='ls|grep foo'
var2='ls|grep bar'
common=$(comm -1 -2 <(eval $var1) <(eval $var2))
var1='ls | grep foo'
var2='ls | grep bar'

common=$(comm-1-2对原始版本的最小修改如下:

var1='ls|grep foo'
var2='ls|grep bar'
common=$(comm -1 -2 <(eval $var1) <(eval $var2))
var1='ls | grep foo'
var2='ls | grep bar'

common=$(comm-1-2考虑到大家普遍接受您,并且您正在使用bash,我建议您使用globbing和一个数组

$ touch foobar foo_and_bar bar_foo foo_alone just_bar
$ declare -A a b
$ for f in *foo*; do a["$f"]=1; done
$ for f in *bar*; do unset a["$f"]; done
$ declare -p a
declare -A a=([foo_alone]="1" )

它使用一个关联数组(需要bash版本4或更高版本)将第一个集合中的文件名存储为索引值,然后逐步遍历第二个集合,删除匹配的文件,显然会留下任何不匹配的文件


它的输出不是完全不同的,这是您从
comm-23
中得到的那种东西,但是它在bash中以本机方式处理比较,而不是生成外部程序。您可以交换globs来调整它,使此函数类似于
comm-12
。(但是
foo
bar
无论如何都只是占位符。)

鉴于人们普遍认为您和您使用的是bash,我建议您使用globbing和数组。可能类似这样:

$ touch foobar foo_and_bar bar_foo foo_alone just_bar
$ declare -A a b
$ for f in *foo*; do a["$f"]=1; done
$ for f in *bar*; do unset a["$f"]; done
$ declare -p a
declare -A a=([foo_alone]="1" )

它使用一个关联数组(需要bash版本4或更高版本)将第一个集合中的文件名存储为索引值,然后逐步遍历第二个集合,删除匹配的文件,显然会留下任何不匹配的文件


它的输出不是完全不同的,这是您从
comm-23
中得到的那种东西,但是它在bash中以本机方式处理比较,而不是生成外部程序。您可以交换globs来调整它,使此函数类似于
comm-12
。(但无论如何,
foo
bar
只是占位符。)

您是否有一些名称在当前目录中包含foo和bar的命令?您的示例代码是否在某种程度上代表了您实际想要实现的目标?例如,如果提供一种比较文件列表的更好方法,这是否会有所帮助,或者您只是需要有关
comm
的帮助?我将问题编辑为h更多信息您是否有一些名称在当前目录中包含foo和bar的命令?您的示例代码是否在某种程度上代表了您实际想要实现的目标?例如,如果您可以获得一种比较文件列表的更好方法,这会有帮助吗,或者您只是想获得有关
comm
的帮助?我编辑了这个问题为了获得更多信息,最后一个函数只使用
foo
bar
的文件glob,对吗?因此它将只使用具有模式的文件。但是OP希望包含模式的文件名
foo
/
bar
?True;我根据文字示例创建了模式。不过,理论上,您始终可以替换常规表达式具有扩展模式的sion,尽管结果可能非常大。(
{2,5}
类似于
@(???????????????????)
;想象一下替换
{1100}
。最后一个函数只使用
foo
bar
的文件glob,对吗?因此它将只使用具有该模式的文件。但是OP希望包含该模式的文件名
foo
/
bar
?True;我根据文字示例创建了模式。不过,理论上,您总是可以用一个扩展模式,虽然结果可能大得令人望而却步。(
{2,5}
类似于
@(????????????????)
;想象一下替换
{1100}
。谢谢你的解释,也谢谢你的解释
var1='ls|grep foo'
var2='ls|grep bar'
common=$(comm -1 -2 <(eval $var1) <(eval $var2))
$ touch foobar foo_and_bar bar_foo foo_alone just_bar
$ declare -A a b
$ for f in *foo*; do a["$f"]=1; done
$ for f in *bar*; do unset a["$f"]; done
$ declare -p a
declare -A a=([foo_alone]="1" )
$ printf '%q\n' "${!a[@]}"
foo_alone