Hey Alex, I don't have much experience when it comes to actions, but I would try this (dirty,unchecked code,wrote it just now):
int rotateAmount = 5;
int moveAmount = 2;
id actionShakeRotate = [Sequence actions:
[RotateBy actionWithDuration:0.1 angle:rotateAmount],
[RotateBy actionWithDuration:0.1 angle:-rotateAmount],
[RotateBy actionWithDuration:0.1 angle:rotateAmount],
[RotateBy actionWithDuration:0.1 angle:-rotateAmount],
[RotateBy actionWithDuration:0.1 angle:rotateAmount],
[RotateBy actionWithDuration:0.1 angle:-rotateAmount],
[RotateBy actionWithDuration:0.1 angle:rotateAmount],
[RotateBy actionWithDuration:0.1 angle:-rotateAmount],
nil];
id actionShakeMove = [Sequence actions:
[MoveBy actionWithDuration:0.1 position:ccp(moveAmount,0)],
[MoveBy actionWithDuration:0.1 position:ccp(-moveAmount,0)],
[MoveBy actionWithDuration:0.1 position:ccp(moveAmount,0)],
[MoveBy actionWithDuration:0.1 position:ccp(-moveAmount,0)],
[MoveBy actionWithDuration:0.1 position:ccp(moveAmount,0)],
[MoveBy actionWithDuration:0.1 position:ccp(-moveAmount,0)],
[MoveBy actionWithDuration:0.1 position:ccp(moveAmount,0)],
[MoveBy actionWithDuration:0.1 position:ccp(-moveAmount,0)],
nil];
[sprite runAction:actionShakeRotate];
[sprite runAction:actionShakeMove];
What you have there are two action sequences.
One will rotate it left to right by "rotateAmount" amount, 4 times, with a total duration of 0.8 seconds.
The other will move it left to right by "moveAmount", 4 times, with a total time of, again, 0.8 seconds.
If you call them sequentially on the sprite, they should run together, or with such a minimal delay that is not noticeable.
If you play with those values you should obtain a "shaky" effect on the sprite.
Also, in your touchesEnded function, you'll want to check which sprite, if any, was touched.
A quick search on the forum will yield a few discussions regarding the matter.
Hope that helps,
cheers
Patrick