大家好:我正在创建一个xfe脚本,将给定目录作为源文件,使用zenity获取输出目录并执行一些操作,例如:
#!/bin/bash
OUTPUT_DIR=`zenity --file-selection --directory --filename="$1"`
if [ $? == 0 ]; then
find . -maxdepth 1 -type f -name "*.wav" -exec bash -c 'oggenc -Q "$0" -q 3 "$OUTPUT_DIR/${0%.wav}.ogg"' {} \;
fi
当调用脚本时,oggenc没有被执行......任何想法?
解决方案:根据下面的答案,这可以按预期工作:
#!/usr/bin/sh
OUTPUT_DIR=$(zenity --file-selection --directory --filename="$1")
if [ $? = 0 ]; then
export OUTPUT_DIR
find "$1" -maxdepth 1 -type f -name "*.wav" -exec sh -c 'oggenc -Q "$0" -q 3 -o "${OUTPUT_DIR}/$(basename "${0/.wav/.ogg}")"' {} \;
fi
zenity --info --text="Done"
答案 0 :(得分:1)
要使变量$OUTPUT_DIR
对子进程可用,请添加一行:
OUTPUT_DIR=$(zenity --file-selection --directory --filename="$1")
if [ $? = 0 ]; then
export OUTPUT_DIR
find . -maxdepth 1 -type f -name "*.wav" -exec bash -c 'oggenc -Q "$0" -q 3 "$OUTPUT_DIR/${0%.wav}.ogg"' {} \;
fi
或者,稍微简单一些:
if OUTPUT_DIR=$(zenity --file-selection --directory --filename="$1"); then
export OUTPUT_DIR
find . -maxdepth 1 -type f -name "*.wav" -exec bash -c 'oggenc -Q "$0" -q 3 "$OUTPUT_DIR/${0%.wav}.ogg"' {} \;
fi
注意:
命令'oggenc -Q "$0" -q 3 "$OUTPUT_DIR/${0%.wav}.ogg"'
出现在单引号中。这意味着父shell不会扩展变量。它们由子shell扩展。要使其可用于子shell,必须导出变量。
[ $? == 0 ]
适用于bash,但[ $? = 0 ]
也可以使用,并且更便于使用。
命令替换可以使用反引号完成,而一些旧shell只接受反引号。然而,对于现代贝壳,$(...)
具有提高可读性的优点(某些字体不能清楚地区分背面和正常的引号)。 $(...)
也可以以清晰明智的方式嵌套。
答案 1 :(得分:1)
我更喜欢使用while
循环而不是流水线操作。您的代码可能会以这种方式重写
while IFS= read -r -d '' file; do
oggenc -Q "${file}" -q 3 "${OUTPUT_DIR}/$(basename ${file/.wav/.ogg})"
done < <(find . -maxdepth 1 -type f -name "*.wav" -print0)
您的代码无效的原因是单引号'
禁止变量扩展,因此$OUTPUT_DIR
不会扩展。
修改强>
-print0
与IFS=
一起使用,仅在find
上分割\0
输出,而不在文件名中的空格分割。