如何逐行读取并使用cat执行每一行

时间:2011-10-02 10:44:43

标签: bash

我有js.txt文件,其中包含javascript文件的路径。我想将所有javascripts输出到一个文件中。

js.txt内容:

  

JS / jQuery的/ jQuery的1.6.2.min.js

     

JS / jQuery的/ jquery的-UI-1.8.6.custom.min.js

我的bash脚本:

#!/bin/bash
WEBROOT=/home/rexxar/web/webroot/

FILE=$WEBROOT"js.txt"
cat "js.txt" | while read LINE; do
    cat $WEBROOT$LINE >> js_all.js
done

终端输出是错误消息:“目录或文件不存在”,后面是每行的文件路径片段。

: Directory or file doesn't exist/jquery/jquery-1.6.2.min.js

: Directory or file doesn't exist/jquery/jquery-ui-1.8.6.custom.min.js

我确信所有路径都是正确的,文件确实存在。

4 个答案:

答案 0 :(得分:2)

首先,一些建议。

1)检查文件js/jquery/jquery-1.6.2.min.jsjs/jquery/jquery-ui-1.8.6.custom.min.js的绝对路径。使用readlink -fdirname

2)检查脚本运行目录的绝对路径。

3)考虑变量$ FILE。使用cat ${FILE}代替cat "js.txt"

可能是个好主意

4)js.txt中的空行也会给你带来一些问题。

5)你为什么要使用CAPS_VARIABLE_NAMES?

其次,解决方案。

我试图理解你的问题,所以我已经创建了你所有的文件:

$> cat js/jquery/jquery-1.6.2.min.js 
test1
$> cat js/jquery/jquery-ui-1.8.6.custom.min.js 
test2
$> cat js.txt 
js/jquery/jquery-1.6.2.min.js
js/jquery/jquery-ui-1.8.6.custom.min.js

所以,就像Arnout Engelen所说(但我不明白为什么他使用>代替>>

$> cat ./js.txt | xargs cat >> ./js_all
$> cat ./js_all
test1
test2

答案 1 :(得分:1)

怎么样:

cd $WEBROOT; cat js.txt | xargs cat > js_all.js

答案 2 :(得分:1)

在我看来,你的js.txt文件有DOS行结尾(回车+换行)而不是unix(只是换行),脚本将CR视为文件名的一部分。要么用dos2unix之类的东西转换文件,要么让脚本动态转换它:

...
tr -d "\r" <"js.txt" | while read LINE; do
....

答案 3 :(得分:1)

相对路径保存在js.txt中。您必须确保该路径在您执行脚本的目录中有效。除非在您的脚本中首先将'cd'命令运行到正确的目录。

如果目录事物是固定的,awk oneliner可以做你需要的。

awk '{if($0) system("cat "$0" >> js_all.js")}' js.txt