2

I want to monitor the output of a command and whenever it contains a certain string I want to run another command.

Example: when command1 outputs 1234 I want to run command2

2

Typically this is accomplished with if statement and grep pipeline. Something like

$ if df | grep '/dev/sdb1' -q; then echo "Partition mounted"; fi
Partition mounted

Trick here, is that if statements operate on exit statuses of commands, and the exit status of the whole pipeline is the exit status of the last command. Of course grep -q will not print anything to the screen, but the zero exit status will tell you whether or not the command succeeded (i.e. grep found desired string in the output) or not if non-zero.


A different approach is via case statement, and command substitution, which I'd find perhaps more suitable where output is a single-line, and where you want to shoot for script portability between operating systems ( aka POSIX compliance ).

case "$(mountpoint /)" in 
    *"is a mountpoint"*) echo "Yup,it's a mount point alright"; 
                         stat /;; 
esac

Third way, would be via again command-substitution and test command for exact match.

[ "$(command1 )" = "Some string"  ]

Or bash's extended test [[ for pattern matching:

# [[ $(command1) =~ ^pattern$ ]]
$ [[ "$( mountpoint /proc )" =~ .*is\ a\ mountpoint.*  ]] && echo "Yup"
Yup

Those can be used within if statement, or with conditional operators like &&, e.g. [ "$(echo test)" = "test" ] && df.

Best approach, I think would be to make it all a function so that you can pass your argument to the desired command, and perhaps reuse it later within if or case statement. So something like this:

check_mountpoint(){
        case "$(mountpoint "$1")" in 
        *"is a mountpoint"*) echo "Yup,"$1" is a mount point alright"; 
                             stat "$1";; 
    esac
}

Of course, keep in mind these are just slightly verbose, and perhaps unnecessary, but still examples of how it can be done. Adapt to your specific case as necessary. Keep in mind this is not exhaustive information,too.

1

I would use this:

[[ $(Command1) == 1234 ]] && Command2
  • The [[ and ]] tests if the condition inside is true
  • && executes Command2 if the condition tested true
  • $(...) executes command inside parenthesis and returns output (what was echoed inside Command1

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.