文件的Unix Bash内容作为参数在第一行停止

时间:2018-10-22 20:52:02

标签: bash unix

我遇到了一个似乎是菜鸟错误的问题,但是我找不到找到解决方案的方法。

我有一个bash脚本:log.sh 这是:

#!/bin/bash
echo $1 >> log_out.txt

并使用一个由文件名组成的文件(取自“ find”的输出,其名称为filesnames.txt,包含53行绝对路径),我尝试:

./log.sh $(cat filenames.txt)

我在log_out.txt中唯一的输出是第一行。 我需要将每行分别处理,因为我需要将它们放入带有2个软件的管道中的参数中。 我检查了:

  • 我的行以/ n终止
  • 使用简单回显而不写入文件
  • 在互联网上找到的所有cat filenames.txt或(<< filenames.txt)

我确定这是一件非常愚蠢的事情,但是我找不到为什么不能重复多行的原因:(

谢谢

3 个答案:

答案 0 :(得分:1)

这是因为您的./log.sh $(cat filenames.txt)被视为一个参数。

while IFS= read -r line; do
 echo "$line";
done < filenames.txt

根据https://mywiki.wooledge.org/DontReadLinesWithFor

进行编辑

编辑#2:

  • 要在结果中保留开头和结尾的空格,请将IFS设置为空字符串。
  • 您可以进一步简化操作,并跳过使用显式变量,而使用默认的$REPLY

来源:http://wiki.bash-hackers.org/commands/builtin/read

答案 1 :(得分:0)

您需要引用命令替换。否则$1将只是文件中的第一个单词。

./log.sh "$(cat filenames.txt)"

您还应该在脚本中引用该变量,否则所有换行符都将转换为空格。

echo "$1" >> log_out.txt

如果要分别处理每个单词,则可以省略引号

./log.sh $(cat filenames.txt)

,然后在脚本中使用循环:

#!/bin/bash
for word in "$@"
do
    echo "$word"
done >> log_out.txt

请注意,仅当文件每行包含一个单词并且单词中没有通配符时,此解决方案才能正常工作。请参阅mywiki.wooledge.org/DontReadLinesWithFor,以了解为什么这不能推广到更复杂的行。

答案 2 :(得分:0)

您可以迭代每一行。

library(tidyverse)

d<-mtcars%>%mutate(mpg2=ifelse(gear==5,mpg*1000000,mpg))

ggplot(d) +
      geom_point(aes(mpg2, cyl)) +
      facet_wrap(~ gear, scales = "free")+
      scale_x_continuous(name = NULL,  labels = function(l) {
          return(paste0(round(l / 1000, 1), "K"))
      })