Jon Ericson
Jon Ericson

Reputation: 21505

How do I reuse a command in bash with different parameters?

I have two scripts that often need to be run with the same parameter:

$ populate.ksh 9241 && check.ksh 9241

When I need to change the parameter (9241 in this example), I can go back and edit the line in history. But since I need to change the number in two places, I sometimes make a typo. I'd like to be able to change the parameter just once to change it in both places.

Upvotes: 4

Views: 3215

Answers (4)

Correct answers have already been given, but for a more general understanding read the manpage with special attention to "History Expansion" and the associated shell variables (such as "HISTCONTROL", "histchars", etc.). BTW-- Your pager's search function is very useful when reading man bash

Upvotes: 2

Jon Ericson
Jon Ericson

Reputation: 21505

One solution is to simply create a wrapper script (populate_check.ksh) that calls the scripts in turn:

r=$1
populate.ksh $r && check.ksh $r

Or for multiple parameters:

for r; do
   populate.ksh $r && check.ksh $r
done

For tasks that are more transient, you can also parametrize the command so that it's easier to edit in history:

$ r=9241; populate.ksh $r && check.ksh $r

Or to do several at once:

$ for r in 9241 9242; do populate.ksh $r && check.ksh $r; done

Upvotes: 1

C. K. Young
C. K. Young

Reputation: 223003

In bash:

!!:gs/9241/9243/

Yes, it uses gs///, not s///g. :-)

(zigdon's answer uses the last command starting with pop, such as populate.sh. My answer uses the last command, full stop. Choose which works for you.)

Upvotes: 10

zigdon
zigdon

Reputation: 15063

You can also use the history substitution feature:

!pop:gs/9241/1234

Like so:

$ populate.ksh 9241 && check.ksh 9241
...
$ !pop:gs/9241/1234
populate.ksh 1234 && check.ksh 1234
...

Upvotes: 5

Related Questions