Доступ к каждой строке с помощью знака $ в Linux - PullRequest
0 голосов
/ 10 января 2012

Всякий раз, когда я выполняю команду linux, которая выводит несколько строк, я хочу выполнить некоторые операции с каждой строкой вывода. как правило, я делаю

command something | while read a
do
  some operation on $a;
done

Это отлично работает. Но мой вопрос: есть ли какой-нибудь способ, как я могу получить доступ к каждой строке с помощью предопределенного символа (не знаю, как это назвать) /// что-то вроде $? .. или .. $! .. или .. $ _

Можно ли сделать

cat to_be_removed.txt | rm -f $LINE

есть ли предопределенный $ LINE в bash .. или предыдущий - самый короткий путь. то есть.

cat to_be_removed.txt | while read line; do rm -f $line; done;

Ответы [ 3 ]

7 голосов
/ 10 января 2012

xargs - это то, что вы ищете:

cat to_be_removed.txt | xargs rm -f

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

5 голосов
/ 10 января 2012

Возможно, вы ищете команду xargs.

Она принимает управляющие аргументы, плюс команду и, необязательно, некоторые аргументы для команды.Затем он считывает свой стандартный ввод, обычно разделяясь на пустое пространство, и затем организует многократное выполнение команды с заданными аргументами и таким количеством «имен файлов», которые считываются из стандартного ввода, которые поместятся в командной строке.

2 голосов
/ 10 января 2012
 rm -f $(<to_be_removed.txt)

Это работает, потому что rm может принимать несколько файлов в качестве входных данных. Это также делает его намного более эффективным, потому что вы вызываете rm только один раз, и вам не нужно создавать канал для cat или xargs

В отдельном примечании вместо использования конвейеров в цикле while можно избежать подоболочки, используя подстановку процесса:

while read line; do
  some operation on $a;
done < <(command something)

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

...