ls for cut -f 字符串不起作用

Les*_*zek 5 ls bash string cut

我在将cut输出馈送到ls.
这不起作用:

rep="S1_1000,0000-00-00c,0000-00-00d,0000-00-00e"  
ls tab_yeast/{`echo $rep | cut -f2- -d','`}*.tab.gz  
ls: cannot access tab_yeast/{0000-00-00c,0000-00-00d,0000-00-00e}*.tab.gz: No such file or directory
Run Code Online (Sandbox Code Playgroud)

而 ls 在该字符串上有效:

ls tab_yeast/{0000-00-00c,0000-00-00d,0000-00-00e}*.tab.gz  
Run Code Online (Sandbox Code Playgroud)

任何的想法?

slm*_*slm 4

我不相信您可以使用大括号扩展来嵌套命令。它似乎只能包含文字。不过,您应该能够利用它eval来获得您想要的东西。

例子

$ a=1
$ b=5
$ echo {$a..$b}
{1..5}
Run Code Online (Sandbox Code Playgroud)

eval但是,如果您echo

$ eval echo {$a..$b}
1 2 3 4 5
Run Code Online (Sandbox Code Playgroud)

你的例子

$ ls -l tab_yeast
total 0
-rw-rw-r--. 1 saml saml 0 Feb 21 05:40 0000-00-00c.1.tab.gz
-rw-rw-r--. 1 saml saml 0 Feb 21 05:40 0000-00-00d.1.tab.gz
-rw-rw-r--. 1 saml saml 0 Feb 21 05:40 0000-00-00e.1.tab.gz
-rw-rw-r--. 1 saml saml 0 Feb 21 05:40 S1_1000.1.tab.gz
Run Code Online (Sandbox Code Playgroud)

显示扩展

$ eval echo tab_yeast/{`echo $rep | cut -f2- -d','`}*.tab.gz  
tab_yeast/0000-00-00c.1.tab.gz tab_yeast/0000-00-00d.1.tab.gz tab_yeast/0000-00-00e.1.tab.gz
Run Code Online (Sandbox Code Playgroud)

你修改后的命令

$ ls -1 $(eval echo tab_yeast/{`echo $rep | cut -f2- -d','`}*.tab.gz)
tab_yeast/0000-00-00c.1.tab.gz
tab_yeast/0000-00-00d.1.tab.gz
tab_yeast/0000-00-00e.1.tab.gz
Run Code Online (Sandbox Code Playgroud)

  • +1。由于 [shell 扩展](http://www.gnu.org/software/bash/manual/bashref.html#Shell-Expansions) 的顺序,命令替换和变量扩展不能发生在大括号表达式内。 (2认同)