2015-06-30 47 views
0

我有以下scrip,它从两个不同的目录中读取文件。随着第一组文件我做了一些东西。从另一个目录中读取每行的另一组文件(.txt)。现在一切正常,除了我必须包含引号才能使脚本工作。如果我不包含它们,它只会从第一个目录中读取文件。从两个不同的目录中读取文件

这是我正在运行它

庆典move.sh “资料/生成/工作/ 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

'profiles_ * .a'中有一个空格。如果未加引号,则字段拆分会在空间上发生,并且在脚本开始之前发生文件扩展,从而仅保留读取的第一个文件。 –

+0

使用双引号是变量合理处理的事实标准。简单的空格将会破坏你的脚本。总是引用你的变量。阅读:http://mywiki.wooledge.org/WordSplitting – tvm

+1

每个可以在脚本中引用的变量都是*引号。这个脚本的参数被引用,所以变量扩展不能让globs扩展正确。 –

回答

1

不通过引用图案的外壳作为参数;相反,选择一个非文件分隔符来区分这两组文件。 (在这里,我使用:::,这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=("[email protected]") 

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

你在做什么可能是最简单的方法。如果没有引号,则评估星号,脚本会获取两个文件名列表。

例:脚本列出所有参数:

$ 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 
+0

通常,他的方法不允许包含由shell特别解释的空格或其他字符的文件名。 – chepner

+0

您可以使用单引号,禁用内容的解释。 – chw21

+0

这可以防止引用字符串中的参数扩展,这不是问题。 – chepner