2014-01-22 4 views
0

не могли бы вы помочь мне понять, что именно делает этот кусок кода? Я предполагаю, что это два аргумента из сценария оболочки, который является частью этого, но я не могу понять смысл строк с //, %% и ##. Заранее спасибо за вашу помощь.Что делает эта функция unix?

getEnvVal() 
{ 
    tNm=`grep $1 $2` 
    tNm=${tNm//$1} 
    tNm=${tNm%% } 
    tNm=${tNm## } 
    echo $tNm 
} 
+1

См http://www.gnu.org/software/bash/manual/bashref.html#Shell-Parameter-Expansion – fedorqui

+0

Я посмотрел на вашу ссылку, но отсутствует объяснение // строка кода и также нет примера, поэтому я, честно говоря, не понимаю предоставленных объяснений ... –

+0

Не могли бы вы рассказать мне, что представляет собой ваш вход ($ 1 и $ 2) и какой результат этой функции? – Mari

ответ

2
  • tNm=`grep $1 $2`спасает выход grep к переменному
  • tNm=${tNm//$1}удаляет всех вхождений значения из $1 от переменной
  • tNm=${tNm%% }удаляет единое пространство из конец переменной
  • tNm=${tNm## }удаляет единого пространства от начала переменных
  • echo $tNmотпечатков переменного значения

Я бы не рекомендовал использовать этот сценарий, потому что есть много проблем с этим:

  • Использование устарело `foo` конструкция. Вы должны использовать $(foo).
  • Полосы новой строки с конца вывода grep. Чтобы получить буквальный вывод grep вам придется использовать что-то вроде этого:

    tNm=$(grep "$1" "$2"; printf x) 
    tNm=${tNm%x} 
    
  • Переменные не quoted properly.
  • Если $1 содержит любые символы, имеющие особое значение в Bash, ${tNm//$1}, вероятно, будет вести себя неожиданно (спасибо @chepner).
  • Автор, вероятно, имел в виду, чтобы удалить Множественные пространства с самого начала и конца строки:

    tNm=${tNm%% *} 
    tNm=${tNm## *} 
    
  • echo будет вести себя неожиданно, если переменная начинается с тире. Вместо этого используйте printf.
  • Имя переменной не имеет смысла.
+1

Еще две потенциальные проблемы: 1) '$ 1' не цитируется, поэтому, если (предполагаемое) регулярное выражение также является допустимым шаблоном, оно будет расширен оболочкой до того, как ее увидит' grep', а 2) '$ 1' впоследствии используется как шаблон для изменения значения 'tNm'. Предполагая, что '$ 1' - фиксированная строка, устраняет обе эти проблемы. – chepner

+0

Совет о 'echo', как правило, правильный, но зависит от фактической используемой оболочки (поскольку' echo' является встроенным). Например, bash, как правило, более надежный с аргументами, начинающимися с дефиса, чем ksh.В ksh88 'print --' является лучшей альтернативой, поскольку' printf' не является встроенным. В любом случае 'printf' также будет страдать от проблем с дефисом при неправильном использовании: try' var = -n; printf "$ var" ' – cdarke

Смежные вопросы