如何在bash程序中运行命令?

时间:2018-12-29 08:56:47

标签: bash

我可以运行此命令

./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

2 个答案:

答案 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在线手册。