Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Want to check whether a command succeeded by redirecting its output to a variable

Tags:

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?

like image 915
Patrick Avatar asked Apr 18 '11 10:04

Patrick


People also ask

How do you know if a command has been succeeded?

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.

How do you redirect output of a command to a variable?

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

Can we redirect the output of a command to a file and display at the same time?

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.


1 Answers

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.

like image 158
falstro Avatar answered Oct 01 '22 18:10

falstro