2014-10-03 2 views
0

Я хотел бы знать, какая разница между двумя приведенными ниже командами?Понимание использования подстановки команд в bash

ubuntu:~/bin$ (ls -A1 /home/ | wc -l) 
1 

ubuntu:~/bin$ $(ls -A1 /home/ | wc -l) 
1: command not found 

Если я ставлю dir_count=(ls -A1 /home/ | wc -l) в сценарии я получаю следующее сообщение об ошибке.

./two_args: line 24: syntax error near unexpected token `|' 
./two_args: line 24: `dir_1_count=(ls -A1 "$dir_1" | wc -l)' 

где в следующих работах:

dir_count=$(ls -A1 /home/ | wc -l) 
+0

Вы определяете переменную с помощью команды 'var = $ (command)'. Поэтому вам нужно использовать 'dir_count = $ (ls -A1/home/| wc -l)'. Независимо от того, является ли это скриптом или консолью. – fedorqui

ответ

1

$(command), есть command substitution. Он просто выполняет команду и заменяет стандартный вывод команды.

Так что, если вы хотите установить переменную, просто: dir_count=$(ls -A1 /home/ | wc -l)

О остальной части кода:

(ls -A1 /home/ | wc -l) 

это один выполняет команду в субоболочке. Скорее всего, вам не нужны эти круглые скобки.

$(ls -A1 /home/ | wc -l) 

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

0

Для упрощения переменной управления в сценарии, я рекомендую вам попробовать следующее:

dir_1_count=`ls -A1 ${dir1} | wc -l` 

Использование символа "`" в разграничить переменные и сохранить результат обычной команды оболочки в вашем скрипте.

Не забудьте использовать инвертированный апостроф, а не одну цитату, скопируйте определение переменной, которое я вам только что дал.

+0

Спасибо за подсказку, но это не отвечает на мой вопрос. Я попробую ваш метод. Однако все еще ищу ответ. – nocl

+1

это замена старого стиля, и это не рекомендуется (это не так, но менее гибко и сложнее разобрать человеческий глаз) –

0

(...) является просто специальным оператором группировки. Он запускает ... в подоболочке, что означает, что он не может изменить среду выполнения родителя (так, например, (foo=bar) бесполезен, так как присваивание не сохранится за окончанием команды), но в противном случае оно обрабатывается довольно нормально (его стандартный вывод идет на стандартный вывод и т. д.).


$(...) является замена; точно так же, как замена $foo на значение переменной foo, $(...) заменяется на выход команды .... Точнее . , , например, (...), он также запускает ... в подоболочке, но кроме того, он фиксирует стандартный вывод ..., а затем заканчивается тем, что заменяется на этот вывод. Так, например, это:

"$(echo cd)" "foo$(echo bar)" 

echo cd работает и захватывает cd, и работает echo bar и захватывает bar, а затем запускает комбинированную команду cd foobar.

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