Ваша оболонка інтерпретує лапки, як '
і "
до того, як вони навіть дістануться echo
. Я, як правило, просто ставлю подвійні лапки навколо свого аргументу, щоб вони лунали, навіть якщо вони непотрібні; наприклад:
$ echo "Hello world"
Hello world
Отже, у вашому першому прикладі, якщо ви хочете включити у свій висновок буквальні лапки, їх або потрібно уникати:
$ echo \'Hello world\'
'Hello world'
Або їх потрібно вже використовувати в аргументі, що цитується (але це не може бути однакова цитата, або вам потрібно буде уникнути цього):
$ echo "'Hello world'"
'Hello world'
$ echo '"Hello world"'
"Hello world"
У вашому другому прикладі ви виконуєте заміну команди в середині рядка:
grep $ARG /var/tmp/setfile | awk {print $2}
Речі, що починаються з $
, також обробляються спеціально оболонкою - вона розглядає їх як змінні та замінює їх значенням. Оскільки, швидше за все, жодна з цих змінних не встановлена у вашій оболонці, вона фактично просто працює
grep /var/tmp/setfile | awk {print}
Оскільки grep
бачить лише один аргумент, він передбачає, що аргумент - це шаблон, який ви шукаєте, і місце, з якого він повинен читати дані, - stdin, тому він блокує очікування введення. Ось чому ваша друга команда, як видається, просто зависає.
Це не відбудеться, якщо аргументувати один аргумент (саме тому ваш перший приклад майже спрацював), тож це один із способів отримати потрібний результат:
echo \'' echo PARAM=` grep $ARG /var/tmp/setfile | awk '{print $2}' ` '\'
Ви також можете подвоїти його цитатами, але тоді вам потрібно буде уникнути $
s, щоб оболонка не вирішила їх як змінні, а також зворотній зв'язок, щоб оболонка не запускала заміну команд відразу:
echo "' echo PARAM=\` grep \$ARG /var/tmp/setfile | awk '{print \$2}' \` '"