2013-05-28 1 views
1

Как это сделать?Вход для трубы переменной, хранящейся в командной строке

[[email protected] ~]# ls | sed 's/.*/"&"/' 
"anaconda-ks.cfg" 
"ca-agent.p12" 

Нравится?

[[email protected] ~]# !QUOTED 
QUOTED="sed 's/.*/\"&\"/'" 
[[email protected] ~]# echo $QUOTED 
sed 's/.*/"&"/' 
[[email protected] ~]# ls| $QUOTED 
sed: -e expression #1, char 1: unknown command: `'' 

Я пробовал всевозможные варианты и вложенные команды echo command/process и eval. Это можно сделать для сценариев?

+0

[Не разобрать команду ls] (http://mywiki.wooledge.org/ParsingLs): 'для е в * ; do echo \ "$ f \"; done' – chepner

ответ

4

Один из способов:

QUOTED='sed s/.*/"&"/' 
ls | $QUOTED 
+1

+1 Сила кавычки. Я думал по строкам 'eval', но это хорошо. –

+0

Я попробовал это на первый, но был обескуражен, когда я увидел это: $ Эхо $ QUOTED СЭД s /.*/"&"/ absense цитат вокруг выражения является конечной СЕПГ грех нормально. Почему это не имеет значения здесь? –

+0

Nevermind, я понимаю, что все, что указано, означает, что внутреннее выражение берется буквально, как это было бы в обычной команде #sed /.*/"&"/ '. Так очевидно, но нет. :) –

2

Что там у вас отлично работает для меня с добавлением eval:

$ QUOTED="sed 's/.*/\"&\"/'" 
$ echo $QUOTED 
sed 's/.*/"&"/' 
$ ls | eval $QUOTED 
"file1" 
"file2" 
"file3" 
"file4" 
+0

О, мужик, ты меня избил. +1. 'eval' - это трюк –

+1

Если у вас нет полного контроля над тем, что находится в командной строке,' eval' может иметь неожиданные последствия. (И если у вас есть полный контроль, зачем вообще хранить его в переменной?) –

+0

Я хочу использовать переменную в скрипте, который имеет множество команд синтаксического анализа, которые возвращают значения с пробелами, с которыми я хочу запускать циклы. Если значения не цитируются, то он расширяется до чего-то вроде «для i в этом» имеет «пробелы» ... »вместо« для i в «это имеет пробелы» ... » –

1

вы хотите псевдоним оболочки здесь

alias QUOTED='sed "s/.*/\"&\"/"' 

Как вы можете видеть, цитируя становится немного сложнее. Использование функции понятнее

unalias QUOTED 
QUOTED() { sed 's/.*/"&"/'; } 

В обоих случаях:

$ printf "%s\n" foo bar baz | QUOTED 
"foo" 
"bar" 
"baz" 
+0

+1 для функции – chepner

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