Извлечение строки в csh - PullRequest
       13

Извлечение строки в csh

1 голос
/ 16 марта 2012

Не могли бы вы объяснить, почему не работает следующая команда оболочки:

sh-3.1$ echo $MYPATH
/opt/Application/DATA/CROM/my_application
sh-3.1$ awk '{print substr($MYPATH,3)}'

Спасибо С наилучшими пожеланиями

Ответы [ 2 ]

1 голос
/ 16 марта 2012

MYPATH не будет заменяться оболочкой, так как строка использует одинарные кавычки.Рассмотрим следующее:

csh$ echo '{print substr($USER,3)}'
{print substr($USER,3)}
csh$ echo "{print substr($USER,3)}"
{print substr(dshawley,3)}

Использование одинарных кавычек указывает оболочке передавать строковый аргумент в программу как есть. Двойные кавычки говорят оболочке выполнить расширение переменной для аргумента перед передачей его в программу.Это базовая функция оболочки, распространенная среди оболочек и некоторых языков программирования (например, perl).

Следующая проблема, с которой вы столкнетесь, заключается в том, что awk будет хотеть заключать в кавычки первый параметрsubstr или анализ не удастся.В этом случае вы, вероятно, увидите предупреждение «Недопустимое имя переменной».Здесь я заблудился с csh, так как не знаю, как правильно избежать двойных кавычек в строке в кавычках.В bash / sh / ksh вы должны сделать следующее:

sh$ awk "{print substr(\"$USER\",3)}"
input
^D
hawley
sh$

На случай, если вы этого еще не знаете, awk потребуется поток ввода, прежде чем он что-то сделает.Для маленького примера мне пришлось набрать «input» и символ EOF.

1 голос
/ 16 марта 2012

Цитирование и экранирование

"string" is a weak quote. Enclosed whitespace and wildcards are taken as literals, but variable and command substitutions are still performed.
'string' is a strong quote. The entire enclosed string is taken as a literal.

Вы можете использовать опцию -v для передачи переменной в awk:

awk -v mypath=$MYPATH 'BEGIN{print substr(mypath, 3)}'
...