我试图通过循环浏览目录中的所有文件来运行某些命令。代码是:
#!/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"
也不起作用......
答案 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