
У меня есть команда в моем скрипте csh, которая может выдавать как минимум 2 строки вывода, но может быть и больше. Я превращаю эти строки в отдельные переменные, которые затем хочу передать другой команде. Как мне настроить вторую команду на цикл и запуск для каждой переменной, выведенной командой 1? Ниже приведено то, что у меня есть, что превращает вывод команды 1 в переменные.
set vars = `echo "command 1"`
set numRows = $#vars
if ($numRows < 2) then
echo "ERROR! $numRows rows!"
exit
endif
`echo '/command2 -L '$vars[1]'`
решение1
Обратите внимание, я использую bash, а не csh, потому что я не ненавижу себя. Но вы можете сделать все это в csh, вам просто придется перевести. Если вы хотите работать в bash, просто сначала запустите "bash --login", а затем вы работаете в bash.
Чтобы выполнить задачу, которую вы описываете в скрипте оболочки, мы используем каналы, а не циклы, как в языке программирования. Не поймите меня неправильно, тамявляютсяциклические структуры в csh и bash, но для того, что вы описали, мы делаем это по-другому.
Если бы у меня была команда, которая выводит несколько строк, и я хотел бы, чтобы другая команда обрабатывала эти строки по одной, я бы соединил две команды вертикальной чертой | , например, так:
cat file.txt | grep "некоторые слова"
Команда grep обрабатывает каждую строку, поступающую из STDIN, которая связана каналом со STDOUT команды cat. Это тривиальный пример, но он служит.
другой:
echo 'один,два,три' | tr ',' '\n'
Это заменит все запятые на символы новой строки, создав трехстрочный вывод из однострочного ввода.
Если бы я хотел добавить расширение к именам всех файлов в каталоге, я мог бы сделать что-то вроде этого:
cd directory
for filename in *
do
mv ${filename} ${filename}.extension
done
* — это шаблон подстановки файлов. Подстановка файлов — это когда шаблон в командной строке заменяется любым именем файла в текущем каталоге, которое соответствует шаблону подстановки. * означает «что угодно»