我在这里四处转转,可能有一个非常简单的答案。
我有一个bash脚本在thumbdrive中循环播放视频文件,如果它找到.mp4
扩展名,它将使用Youtube的python示例上传到youtube - 它可以从命令行运行。
我在bash脚本中将参数传递给python脚本调用时遇到了麻烦:
cd /home/pi/Documents
echo $PWD
for _file in /media/pi/*/*.mp4; do
clean=$(echo $_file|wc -m)
if [ $clean -gt 15 ]; then
did=$(grep "$_file" /home/pi/Documents/uploaded_videos.txt | wc -l)
if [ $did = 0 ]; then
#Edit this to your liking
#echo "now uploading $_file"
args="--file=\"${_file}\" –-title=\"${_file}\" –-description=\"show 2018\" -–keywords=\"2018,show, Winter,show 2018,\" -–category=\"28\" -–privacyStatus=\"private\""
python yt_up.py "$args"
echo $_file uploaded to youtube via google developer api | logger
echo $_file >> /home/pi/Documents/uploaded_videos.txt
fi
fi
done
但是yt_up.py
脚本无法识别参数。我尝试了各种报价组合,但我无法让它发挥作用。
我可以将一个参数传递给脚本:
python yt_up.py --file="$_file"
有效,
但是没有认识到添加其他参数。
答案 0 :(得分:2)
您当前的代码中有很多反模式和误解!
cd /home/pi/Documents
为了获得最佳实践,您应该测试这是否成功。可能目前不是问题,但这样做并没有什么坏处。
echo $PWD
这里缺少引号,但这不是致命的。
for _file in /media/pi/*/*.mp4; do
clean=$(echo $_file|wc -m)
这不是如何计算字符串中的字符数。您应该使用clean=${#_file}
代替。
if [ $clean -gt 15 ]; then
在这里,我想你想知道全局是否匹配。那不是怎么回事。您要么使用Bash的shopt -s nullglob
选项,要么使用if [ -e "$_file" ]; then
来检查glob是否与实际文件匹配。
did=$(grep "$_file" /home/pi/Documents/uploaded_videos.txt | wc -l)
if [ $did = 0 ]; then
这就是检查文件是否包含字符串的方法。请改用if ! grep -q "$_file" /home/pi/Documents/uploaded_videos.txt; then
。
#Edit this to your liking
#echo "now uploading $_file"
args="--file=\"${_file}\" –-title=\"${_file}\" –-description=\"show 2018\" -–keywords=\"2018,show, Winter,show 2018,\" -–category=\"28\" -–privacyStatus=\"private\""
这里有关于shell如何读取命令的误解。报价删除是在变量扩展之前执行的,因此您的报价是错误的。通常你想使用一个数组!这就是Bash阵列的用途!另请注意,这里有一些奇怪的连字符。
python yt_up.py "$args"
echo $_file uploaded to youtube via google developer api | logger
echo $_file >> /home/pi/Documents/uploaded_videos.txt
fi
fi
done
这有可能解决你的错误(希望能让它发挥作用):
#!/bin/bash
# We define a variable with the path to the uploaded_videos.txt file
uploaded_videos=/home/pi/Documents/uploaded_videos.txt
# Will expand non-matching globs to nothing:
shopt -s nullglob
# cd into the directory, and exit if fails
cd /home/pi/Documents || exit
# Use the builtin pwd instead of echo "$PWD"
pwd
for file in /media/pi/*/*.mp4; do
if ! grep -qFx "$file" "$uploaded_videos"; then
# Define an array to contain the arguments to pass
args=(
--file="$file"
--title="$file"
--description="show 2018"
--keywords="2018,show, Winter,show 2018,"
--category="28"
--privacyStatus="private"
)
# call your script with the fields of the array as arguments
python yt_up.py "${args[@]}"
echo "$file uploaded to youtube via google developer api" | logger
echo "$file" >> "$uploaded_videos"
fi
done
您可以通过明确检查yt_up.py
是否成功来改进最后一步:
if python yt_up.py "${args[@]}"; then
echo "$file uploaded to youtube via google developer api" | logger
echo "$file" >> "$uploaded_videos"
else
echo "Something wrong happened!"
fi
答案 1 :(得分:0)
我认为你只需要在与python命令相同的行中添加参数。像这样
python yt_up.py --file="${_file}" –-title="${_file}" --description="show 2018" --keywords="2018,show, Winter,show 2018," -–category="28" --privacyStatus="private"
它有效
答案 2 :(得分:0)
你的args
python变量是一个很大的sys.argv[1]
,所以你可能会遇到麻烦。
像这样重写shell:
cd /home/pi/Documents
echo $PWD
for _file in /media/pi/*/*.mp4; do
clean=$(echo $_file|wc -m)
if [ $clean -gt 15 ]; then
did=$(grep "$_file" /home/pi/Documents/uploaded_videos.txt | wc -l)
if [ $did = 0 ]; then
#Edit this to your liking
#echo "now uploading $_file"
args=( $(echo "--file=\"${_file}\" –-title=\"${_file}\" –-description=\"show 2018\" -–keywords=\"2018,show, Winter,show 2018,\" -–category=\"28\" -–privacyStatus=\"private\"") )
python yt_up.py "${args[@]}"
echo $_file uploaded to youtube via google developer api | logger
echo $_file >> /home/pi/Documents/uploaded_videos.txt
fi
fi
done
现在args
是数组,每个元素都将被python读取为分开的sys.argv[i]
元素。