Saját magadat csapod be, mert rossz példát írtál. Az első nem megy, hiszen így helyettesítődik:
if [ "kakukk" = "kakukk" -a -a y = "-a y" ]; then
Ez így hibás.
A második jó, hiszen:
if [ x"kakukk" = x"kakukk" -a x"-a y" = x"-a y" ]; then
A harmadik is jó:
if [ "kakukk" = "kakukk" -a "-a y" = "-a y" ]; then
A harmadikkal az a baj, hogy ebben a konkrét esetben ugyan jó, de általában nem. Nézzük ezt:
n="("
m="kakukk"
if [ "$m" = "kakukk" -a "$n" = "(" ]; then
echo kakukk
fi
Helyettesítés után:
if [ "kakukk" = "kakukk" -a "(" = "(" ]; then
Azaz:
if [ kakukk = kakukk -a ( = ( ]; then
Ezzel az a gond, hogy a nyitó zárójelet tényleg nyitó zárójelként értelmezi, s nincs záró párja. Viszont ha odaírod az x-et - vagy szinte bármit -, akkor:
if [ xkakukk = xkakukk -a x( = x( ]; then
Az x( viszont nem olyan karakter, amitől felizgul a test, mint valami speciálisan értelmezendő dolog. Az csak egy buta string.