LINUX.ORG.RU

[bash] Требуется помощь зала

 


0

0

Диспозиция такова: Есть некий скрипт, в нём - примерно вот такой фрагмент:

...
if [ "$1" == "-M" ]; then
	if [ "$2" != "" ]; then
		if [ -f $SOME_PATH/$2 ]; then
			#
			# Здесь с файлом $2 что-то происходит
			#
		else
			echo "[ОШИБОЧКА] $2: нет такого файлика"
			exit 1
		fi
	else
		echo "[ОШИБОЧКА] Нужно указать файлик"
		exit 1
	fi
else
...

Запускают его примерно так:

script -M file1.list

Формат этого file1.list такой:

cmd1 arg1 arg2
cmd2 arg1 arg2
cmd3 arg1
cmd4 arg1
...
То есть, может быть либо 2, либо 3 поля в каждой строке, разделённые пробелами.

Задача: Если этот самый file1.list существует, скрипт должен запустить ещё один экземпляр себя с первой строкой в качестве набора параметров, дождаться завершения, потом со второй, и т.д. до конца файла. То есть, в конечном счёте, вот так:

script --cmd1 arg1 arg2
script --cmd2 arg1 arg2
script --cmd3 arg1
script --cmd4 arg1
...

Вопрос: как это реализовать? Астрал подсказывает, что можно как-то извратиться с awk, но вот как именно - молчит.

★★★★☆

Последнее исправление: Cancellor (всего исправлений: 2)

Я бы сделал так, например:

# Читаем файлик построчно:

IFS=«\n»
for line in `cat file1.list`; do
echo $line | read $a $b $c
./script --$a $b $c
done

undertaker ★★
()

как-то так:

cat file1.list | while read cmd other_str; do
$0 --${cmd} ${other_str}
done

Slavaz ★★★★★
()

Если пробелов в cmd arg1 arg2 нет, то, например, вот так:

while read -d $'\n' i; do ./script --$i; done < file.lst
anonymous
()
Ответ на: комментарий от Cancellor

> Во! Кажись, то что надо. Мерси.

Не за что

P.S. Ого, адекватный человек, а я думал, что на лоре куча невежд и тролей :)

anonymous
()
sed 's/^/script --/' file1.list | sh
sdio ★★★★★
()

>Вопрос: как это реализовать? Астрал подсказывает, что можно как-то извратиться с awk, но вот как именно - молчит.

Легче всего

cat file1.list | sed -e 's/^/--/' | xargs -L1 script

linuxfan
()
Ответ на: комментарий от undertaker

Иии, забыл второй раз IFS установить. Но тут уже подсказали правильно, и даже через sed.

IFS="\n"
for line in `cat file1.list`; do
   IFS=" "
   echo $line | read $a $b $c
   ./script --$a $b $c
   IFS="\n"
done 
undertaker ★★
()
Ответ на: комментарий от dilmah

Блин, глаза замыленные. Спасибо. Первая в read:

read a b c

Тут ещё что-то, не могу понять, echo $line | read a b c не работает.

А вторая в IFS

IFS=$'\n'

undertaker ★★
()
Ответ на: комментарий от dilmah

Блин, глаза замыленные. Спасибо. Первая в read:

read a b c

Тут ещё что-то, не могу понять, echo $line | read a b c не работает.

А вторая в IFS

IFS=$'\n'

undertaker ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.