I'm currently writing a bash script which loads video files up to to YouTube using GoogleCL.
As I'm doing this uploading stuff in a loop (because there can be multiple video files) I would like to check if each file had been uploaded successfully before I upload the next one.
The command google youtube post --access unlisted --category Tech $f
(where $f represents the file) outputs a string which tells me whether the upload has been successful or not.
But I don't know how to redirect that "return string" into a variable to do check the successs.
That's what I have:
for f in ./*.ogv ./*.mov ./*.mp4 do if [[ '*' != ${f:2:1} ]] then echo "Uploading video file $f" # How to put the return value of the following command into a variable? google youtube post --access unlisted --category Tech $f > /dev/null # Now I assume that the output of the command above is available in the variable RETURNVALUE if [[ $RETURNVALUE == *uploaded* ]] then echo "Upload successful." else echo "Upload failed." fi fi done
Can anybody help me?
To get the value, run this command. $ echo $? If a command succeeded successfully, the return value will be 0. If the return value is otherwise, then it didn't run as it's supposed to.
To store the output of a command in a variable, you can use the shell command substitution feature in the forms below: variable_name=$(command) variable_name=$(command [option ...] arg1 arg2 ...) OR variable_name='command' variable_name='command [option ...] arg1 arg2 ...'
Redirecting output to Multiple files and screen: If you want to redirect the screen output to multiple files, the only thing you have to do is add the file names at the end of the tee command.
My guess is that you could depend on the error code from the google command as well (I'm assuming it returns error if it failed to upload, but you should probably double check this).
for f in ./*.ogv ./*.mov ./*.mp4; do if [[ '*' != ${f:2:1} ]]; then echo "Uploading video file $f" if google youtube post --access unlisted --category Tech "$f" > /dev/null then echo "Upload successful." else echo "Upload failed." fi fi done
A common misconception is that if wants a bracketed expression to evaluate, this is not true, if always takes a command and checks the error status; usually this command is [
which is an alias for test
, which evaluates the expression. (And yes, I'd be surprised if there isn't an optimized shortcut to make it go faster inside bash, but conceptually it's still true).
Capturing output is done via backticks, like so
result=`command argument a b c`
or using $()
result=$(command argument a b c)
but it's probably better to use the error code in this case.
EDIT: You have a funny if thing in your function.. I didn't notice at first, but it can be avoided if you enable nullglob
shell option (this will make ./*.mov
to expand to the empty string, if there are no files). Also, quote that $f
or it'll break if your file names contain spaces
shopt -s nullglob for f in ./*.ogv ./*.mov ./*.mp4; do echo "Uploading video file $f" if google youtube post --access unlisted --category Tech "$f" > /dev/null then echo "Upload successful." else echo "Upload failed." fi done
HTH.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With