我有以下脚本从两个不同的目录中读取文件。使用第一组文件,我做了一些事情。使用另一个目录中的另一组文件(.txt),我读取每一行。现在一切正常,除了我必须包含引号以使脚本工作的事实。如果我不包含它们,它只会从第一个目录中读取文件。
这就是我运行它的方式
bash move.sh" profile / generate / work / generate_profiles_output / merged_profiles / profiles_ * .avro" "刺/ MP /呼入/间/文件/ * TXT"
#!/bin/bash
AVROFILES=$1
FILES=$2
#reading every avro file
for avrofile in ${AVROFILES}
do
//do some stuff with the avrofile
#reading the files
for f in $FILES
do
#reading every line in on from the file
while read line
do
done <"$f"
done
done
答案 0 :(得分:1)
不要将引用的模式作为参数传递给shell;相反,选择一个非文件分隔符来区分这两组文件。 (在这里,我使用:::
,GNU parallel
用于类似目的。)
$ bash move.sh profile/generate/work/generate_profiles_output/merged_profiles/profiles_ *.avro ::: prod/mp/incoming/meta/files/*.txt
在您的脚本中,您将扫描参数,将:::
之前的所有内容放在一个数组中,然后将所有内容放在第二个数组中。
while (( $# > 0 )); do
f=$1
shift
if [[ $f = ::: ]]; then
break
fi
AVROFILES+=( "$f" )
done
FILES=( "$@" )
for avrofile in "${AVROFILES[@]}"
do
# do some stuff with the avrofile
# reading the files
for f in "${FILES[@]}"
do
# reading every line in on from the file
while read line
do
done <"$f"
done
done
答案 1 :(得分:0)
你在做什么可能是最简单的方法。如果没有引号,则会评估星号,并且脚本会获得两个文件名列表。
示例:该脚本列出了所有参数:
$ cat files.sh
#!/usr/bin/env bash
i=0
for arg; do
let i++
echo \$$i is $arg
done
$ ./files.sh test-00* test-01*
$1 is test-000.delme
$2 is test-001.delme
$3 is test-002.delme
$4 is test-003.delme
$5 is test-004.delme
<snip>
$ ./files.sh "test-00*" "test-01*"
$1 is test-000.delme test-001.delme test-002.delme test-003.delme test-004.delme test-005.delme test-006.delme test-007.delme test-008.delme test-009.delme
$2 is test-010.delme test-011.delme test-012.delme test-013.delme test-014.delme test-015.delme test-016.delme