将for循环的输出解析为变量,作为逗号分隔的字符串

时间:2012-01-27 15:39:11

标签: bash shell variables

我正在抓取目录中的所有文件名,并且我想创建这些文件名的逗号分隔字符串,以便我可以将该字符串作为参数传递给应用程序。这是我的代码段:

if [[ -n $(ls | grep lpt) ]]; then
  for files in $(find . -maxdepth 1 -type f); do
    #parse output into variable fileList
  done
fi

我如何做到这一点?

3 个答案:

答案 0 :(得分:4)

更容易思考:

find . -maxdepth 1 -type f -printf '%P,' | sed -e 's/,$/\n/'

sed表达式用换行符替换终端,

答案 1 :(得分:1)

您应该使用其他答案中显示的单行,但为了填写您的脚本,您可以这样做:

if [[ -n $(ls | grep lpt) ]]; then
  for file in $(find . -maxdepth 1 -type f); do
    #parse output into variable fileList
    fileList="$file,$fileList"
  done
fi

#now remove the trailing comma from the fileList
fileList=$(sed 's/,$//' <<< "$fileList")

(注意:如果你的文件名中有空格,你的for循环将无法正常工作)

答案 2 :(得分:0)

您可以使用find的{​​{1}}选项以及shell扩展来代替您的循环:

-exec

fileList=$(find . -maxdepth 1 -type f -exec echo -n "{}," \; | sed 's/,$//') 位只是删除尾随的逗号。 sed用于编辑输入流,即此处,它从sed获取管道文本并正在编辑它所获得的内容。由于给定的命令在末尾留下了额外的find,使用其替换命令(sed)来摆脱它。表格是:

s

所以s/EXPRESSION/REPLACEMENT/ 表示“行尾的逗号,因为,$表示”在行尾“,第二个和第三个斜杠之间的虚弱意味着它被替换为什么都没有。

至于$中的\;,这只是使用find的要求,因此它知道何时完成阅读命令,并且它在手册页中。 :)