我遇到了一个似乎是菜鸟错误的问题,但是我找不到找到解决方案的方法。
我有一个bash脚本:log.sh 这是:
#!/bin/bash
echo $1 >> log_out.txt
并使用一个由文件名组成的文件(取自“ find”的输出,其名称为filesnames.txt,包含53行绝对路径),我尝试:
./log.sh $(cat filenames.txt)
我在log_out.txt中唯一的输出是第一行。 我需要将每行分别处理,因为我需要将它们放入带有2个软件的管道中的参数中。 我检查了:
cat filenames.txt
或(<< filenames.txt)我确定这是一件非常愚蠢的事情,但是我找不到为什么不能重复多行的原因:(
谢谢
答案 0 :(得分:1)
这是因为您的./log.sh $(cat filenames.txt)
被视为一个参数。
while IFS= read -r line; do
echo "$line";
done < filenames.txt
根据https://mywiki.wooledge.org/DontReadLinesWithFor
进行编辑编辑#2:
$REPLY
答案 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"))
})