当一个人有命令替换时扩展

时间:2017-04-14 03:45:44

标签: linux bash

我必须回显与string连接的命令替换的输出。要预先添加的字符串实际上是路径名字符串。由于文件名在其开头包含特殊字符-,因此需要使用绝对路径和文件名。我提出的草案只能按计划进行第一行输出。如何将其扩展到其他行?

示例场景如下所示。

/tmp目录中,文件为:

-foo 1.txt
-bar 1.txt

命令和输出是:

$ echo "$PWD/$(ls | grep "^-")"
/tmp/-bar 1.txt
-foo 1.txt

虽然我希望它像

/tmp/-bar 1.txt
/tmp/-foo 1.txt

我阅读了this大括号扩展功能,但我不确定它是否适用于变量或命令替换,如here所述。我还想为每个文件分别使用单独的行和文件名unsplitted,这是在执行大括号扩展时建议的。 (老实说,我不太了解有关大括号扩展等功能的大量文献!)

此外,还有其他更方便的方法吗?任何帮助表示赞赏。

3 个答案:

答案 0 :(得分:1)

要执行您要求的内容,获取以create role myuser with createdb login encrypted password 'mypassword'; create database mydb with owner 'myuser' encoding 'utf8'; pg_hba.conf: local myuser mydb md5 ... 开头的文件的完整路径列表,您可以使用readlink

-

但是,要直接执行您在评论中提到的内容(使用以$ readlink -f ./-* /tmp/-bar 1.pdf /tmp/-foo 1.pdf 开头的文件名作为-的参数),您可以利用pdfgrep --标记选项的结尾,因此将其后的所有内容识别为文件名:

pdfgrep 'pattern' -- -*

另见common convention(准则10):

  

应该接受不是option-argument的第一个--参数作为指示选项结束的分隔符。以下任何参数都应被视为操作数,即使它们以-字符开头。

答案 1 :(得分:1)

根本不要使用ls 。你可以使用glob,你的循环可以是隐含的

$ printf '%s\n' /tmp/-*
/tmp/-foo 1.txt
/tmp/-bar 1.txt

或明确

$ for f in /tmp/-*; do echo "$f"; done
/tmp/-foo 1.txt
/tmp/-bar 1.txt

答案 2 :(得分:0)

使用此

for f in /tmp/-*
do
   echo $f
done