我可以运行此命令
./dropbox_uploader.sh upload /home/pi/abc.jpg abc.jpg
在命令行成功完成,我想在bash程序中运行它,但是我做不到。
我的脚本是:
picfiles=`ls /home/pi/Dropbox-Uploader/*jpg`
for i in $picfiles;do
path="/home/pi/Dropbox-Uploader/dropbox_uploader.sh"
eval $path
upload "$i"
done
答案 0 :(得分:1)
$(...)
的特定版本,而不支持`...`
,否则请使用sh
,而不要使用反引号($()
)。ls
eval
到底做什么,但这是不正确的。这是一个更好的脚本:
pic_directory="/home/pi/Dropbox-Uploader"
uploader_path="/home/pi/Dropbox-Uploader/dropbox_uploader.sh"
# Use globbing so the files aren't word-split incorrectly.
for pic in "$pic_directory"/*.jpg; do
# ${var##glob} removes the longest match of `glob` from the front of `var`.
"$uploader_path" upload "$pic" "${pic##*/}"
# You could also use `basename` and command substitution:
#"$uploader_path" upload "$pic" "$(basename "$pic")"
done
答案 1 :(得分:0)
您的脚本中存在几个问题(出于这种需要,您不应该使用ls,请谨慎使用find,不要在每个循环中定义相同的变量,不要使用无用的eval指令)。
在进行了一些交流之后,并注意了关于BashPitfalls #1的好的建议,这是一种改善脚本的方法:
path="/home/pi/Dropbox-Uploader/dropbox_uploader.sh"
picFilesDir="/tmp/filesToFind"
while IFS= read -r -d '' file; do
"$path" upload "$file" "${file##*/}"
done < <( find "$picFilesDir" -type f -iname '*.jpg' -print0 )
如果您想进一步了解,可以阅读有关Shell parameter expansion的GNU / Bash在线手册。