Twoja powłoka interpretuje cytaty, '
i "
zanim jeszcze do nich dojdą echo
. Generalnie po prostu umieszczam podwójne cytaty wokół mojego argumentu, aby powtórzyć, nawet jeśli są niepotrzebne; na przykład:
$ echo "Hello world"
Hello world
Tak więc w pierwszym przykładzie, jeśli chcesz dołączyć dosłowne znaki cudzysłowu, musisz je usunąć:
$ echo \'Hello world\'
'Hello world'
Lub muszą być już użyte w cytowanym argumencie (ale nie może to być ten sam cytat, inaczej trzeba będzie uciec):
$ echo "'Hello world'"
'Hello world'
$ echo '"Hello world"'
"Hello world"
W drugim przykładzie uruchomiono podstawienie polecenia w środku ciągu:
grep $ARG /var/tmp/setfile | awk {print $2}
Rzeczy, które zaczynają się, $
są również obsługiwane przez powłokę - traktuje je jak zmienne i zastępuje ich wartościami. Ponieważ najprawdopodobniej żadna z tych zmiennych nie jest ustawiona w twojej powłoce, tak naprawdę po prostu działa
grep /var/tmp/setfile | awk {print}
Ponieważ grep
widzi tylko jeden argument, zakłada, że ten argument jest wzorcem, którego szukasz, i że miejscem, z którego powinien odczytać dane, jest standardowe, więc blokuje oczekiwanie na dane wejściowe. Dlatego wydaje się, że twoje drugie polecenie po prostu się zawiesiło.
Nie stanie się tak, jeśli zacytujesz argument pojedynczo (dlatego właśnie twój pierwszy przykład prawie działał), więc jest to jeden ze sposobów uzyskania pożądanego wyniku:
echo \'' echo PARAM=` grep $ARG /var/tmp/setfile | awk '{print $2}' ` '\'
Możesz także zacytować go dwukrotnie, ale wtedy będziesz musiał uciec od $
s, aby powłoka nie rozpoznała ich jako zmiennych, a także backsticks, aby powłoka nie uruchomiła od razu podstawiania poleceń:
echo "' echo PARAM=\` grep \$ARG /var/tmp/setfile | awk '{print \$2}' \` '"