无法在bash文件中转义路径

时间:2015-08-20 08:32:11

标签: bash

我试图通过循环浏览目录中的所有文件来运行某些命令。代码是:

#!/bin/bash
shopt -s nullglob
INPUT_DIR=$1
OUTPUT_DIR=$2

: ${INPUT_DIR:="."}
: ${OUTPUT_DIR:="."}

files="$INPUT_DIR/*.ttf"

for file in $files
do
    base_file=${file##*/}
    output="$OUTPUT_DIR/${base_file%.*}.woff"
    ttf2woff "$file" "$output" || exit 1
done

我希望$INPUT_DIR/*.ttf周围的双qoutes可以发挥魔力,但显然不是:

$> ttf2woff_multi "/Users/ozan/Dropbox/Graphic Library/Google Fonts/fonts-master/ofl/raleway"
Can't open input file (/Users/ozan/Dropbox/Graphic)

当我打印$FILES时,我得到:/Users/ozan/Dropbox/Graphic Library/Google

我在这里缺少什么?

修改:files="$INPUT_DIR"/*.ttf代替files="$INPUT_DIR/*.ttf"也不起作用......

2 个答案:

答案 0 :(得分:1)

除了阵列解决方案(这是一个很好的解决方案)之外,您还可以使用进程替换来使用build.gradle

read

答案 1 :(得分:0)

由于您想循环遍历文件列表,因此最好将它们存储在数组中:

files=("$INPUT_DIR"/*.ttf)

for file in "${files[@]}"
do
    base_file=${file##*/}
    output="$OUTPUT_DIR/${base_file%.*}.woff"
    ttf2woff "$file" "$output" || exit 1
done

请注意,您正在说"$INPUT_DIR/*.ttf",而我建议"$INPUT_DIR"/*.ttf。这是为了让globbing按预期运行并正确扩展。

正如赛勒斯在评论中提到的那样,这里的关键点是没有引用的事实,因为它们阻止了全球化。

查看包含某些文件的示例。

$ ls f*
f1  f2  f3

使用双引号存储...它只匹配字符串本身:

$ files=("f*")
$ for f in "${files[@]}"; do echo "$f"; done
f*

如果我们不引用,请查看它是如何扩展的:

$ files=(f*)
$ for f in "${files[@]}"; do echo "$f"; done
f1
f2
f3