在目录中逐行读取所有文件并对它们执行命令

时间:2013-08-19 17:20:12

标签: bash shell scripting directory

我正在尝试创建一个脚本,允许我在对这些文件的特定列执行命令时逐行读取目录中的所有文件。我正在处理的文件是.txt文件,其值由逗号分隔。我可以通过将文本文件输入到脚本然后输出值而不是多个文件来执行单个文件的代码,这是我的目标。我希望按照它们在目录中的顺序读取文件。这是我到目前为止所拥有的。

directory=$(/dos2unix/*.txt)
file=$(*.txt")
IFS=","
for "$file" in "$directory";
do
    while read -ra line;
    do
            if [ "${line[1]}" != "" ]; then
                echo -n "${line[*]}, Hash Value:"; echo "${line[1]}" | openssl dgst -sha1 | sed 's/^.* //'
            else
                if [ "${line[1]}" == "" ]; then
                    echo "${line[*]}, Hash Value:None";
                fi
            fi
    done
done

我得到的一些错误是:

$ ./orange2.sh
/dos2unix/test1.txt: line 1: hello: command not found
/dos2unix/test1.txt: line 2: goodbye: command not found
/dos2unix/test1.txt: line 4: last: command not found
./orange2.sh: line 28: unexpected EOF while looking for matching `"'
./orange2.sh: line 33: syntax error: unexpected end of file

任何提示,建议或示例?

全部谢谢

更新

我也希望最终复制所有文件以包含你在第一个if语句中看到的命令,所以我想要一个。)保持我的文件分开并且b。)创建一个包含更新的副本值。

1 个答案:

答案 0 :(得分:0)

如果要将文件名保存在变量中,请使用array=(a b c)语法创建数组。没有美元符号。然后使用for item in "${array[@]}"循环遍历数组。

要从具有while read循环的文件中读取,请使用while read; do ...; done < "$file"。它很奇怪,但文件整体重定向到循环中。

files=(/dos2unix/*.txt)

for file in "${files[@]}"; do
    while IFS=',' read -ra line; do
        ...
    done < "$file"
done

另一种方法是使用cat将所有文件连接在一起,这样就可以摆脱外部的for循环。

cat /dos2unix/*.txt | while IFS=',' read -ra line; do
    ...
done