LINUX.ORG.RU

bash-скрипт с переменными


0

1

Как написать bash-скрипт с переменными, в которых есть числа? Например, мне нужно сделать

cuneiform -l rus -o «book-000» «book-000.pbm»
cuneiform -l rus -o «book-001» «book-001.pbm»
cuneiform -l rus -o «book-002» «book-002.pbm»

и далее

cat «book-000» «book-001» «book-002» > «book»

rm -rf «book-000» «book-000.pbm»
rm -rf «book-001» «book-001.pbm»
rm -rf «book-002» «book-002.pbm»

При этом число файлов может составлять несколько сот штук.

Deleted

for file in book-{000..200}
do
cuneiform -l rus -o "$file" "$file".pbm
cat "$file" >> book
rm -rvf "$file" "$file".pbm
done

Как-то так.

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

Спасибо, но что-то не получается. Уж простите, если ляп, я в bash особо не силен.

pete@pete-desktop:/media/MAIN/tmp/test$ ls
book  book-000.ppm  book-001.ppm  book-002.ppm  s
pete@pete-desktop:/media/MAIN/tmp/test$ cat s
for file in book-{000..002}
do
cuneiform -l rus -o "$file" "$file".ppm
cat "$file" >> book
rm -rvf "$file" "$file".ppm
done

pete@pete-desktop:/media/MAIN/tmp/test$ sh s
Cuneiform for Linux 0.7.0
Magick: unable to open image `book-{000..002}.ppm':  @ error/blob.c/OpenBlob/2498
cat: book-{000..002}: Нет такого файла или каталога

Кстати, а cat тут разве не перезапись делает?

Deleted
()

Для генерирования последовательности чисел используйте команду seq, для форматирования - printf.

Eddy_Em ☆☆☆☆☆
()
for a in $(seq 1 10); do printf "book-%03d\n" $a; done
book-001
book-002
book-003
book-004
book-005
book-006
book-007
book-008
book-009
book-010
Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Led

Вы про -w? Но в этом случае ширина поля будет рассчитана по максимальной цифре. А если у вас нумерация трехзначная, а максимальное число - двухзначное?

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Led

>«book-0$(seq -w 1 99)»

Тьфу, блин.:) Ну ты понял - никто не мешает первый '0' указать явно как чать шаблона

Led ★★★☆☆
()
Ответ на: комментарий от anon_666

Та же самая ошибка. Прочитал, что в убунте вместо bash используется dash, но как вернуть, не понял.

Deleted
()
Ответ на: комментарий от anon_666

Мне, на самом деле, без разницы, bash это или dash, я одинаково плохо в них разбираюсь. Нужно просто, чтобы работало :)

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

>Нужно просто, чтобы работало :)

Нормальное желание. Когда что-то по поводу сантехники у меня возникает желание «чтобы просто работало» и я не знаю как это сделать - я вызываю специалиста и плачУ ему деньги за то, чтобы «просто работало»

Led ★★★☆☆
()
Ответ на: комментарий от Deleted

Кстати, а cat тут разве не перезапись делает?
cat>перезапись
cat>>дозапись

darkshvein ☆☆
()
Ответ на: комментарий от AITap

for file in book-{000..200}

У ТС очень много файлов - он может упереться в ограничение длинны командной строки. Лучше сделать С-подобный цикл

for (( i = 0; i < 200; i++ ))
do
 file="book-$i"
 # ....
done

ЗЫЖ даша не знаю, выше bash. в бубунте он тоже есть, только спрятан где-то.

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

>dash - это POSIX shell

а зачем bash убрали?! нубов путают?

где он там спрятан, лежит как всегда в /bin/bash.

значит в начале скрипта достаточно добавить sha-bang #!/bin/bash

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

>У ТС очень много файлов - он может упереться в ограничение длинны командной строки.

256K? Ну попробуй, «упрись», с приведённым шаблоном:)

Led ★★★☆☆
()
Ответ на: комментарий от drBatty

У ТС очень много файлов - он может упереться в ограничение длинны командной строки.

$ /bin/true {1..1000000}
bash: /bin/true: Argument list too long
$ for x in {1..1000000}; do /bin/true $x; done
$ 
const86 ★★★★★
()
Ответ на: комментарий от Led

Если ширина поля будет постоянной, а количество страниц - переменным, проще воспользоваться все-таки printf'ом.

Eddy_Em ☆☆☆☆☆
()

Все bash да bash... POSIX shell:

LAST=999 # Указать правильно
CUR=0

while [ $CUR -le $LAST ]; do
  nm=`printf "book-%03d" $CUR`
  cuneiform -l rus -o "$nm" "$nm.pnm"
  CUR=`expr $CUR + 1`
done

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

>256K? Ну попробуй, «упрись», с приведённым шаблоном:)

1) 32K

2) шаблон может быть и иным.

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

$ for x in {1..1000000}; do /bin/true $x; done

я так делал архив tar -tzf backup.tgz *

ошибок не было. Просто в backup.tgz попали НЕ ВСЕ файлы. С тех пор юзаю циклы и xargs.

denton, попробуйте POSIX пример от rymis. Для моего нужно:

1) проверить, если у вас /bin/bash

2) в начале скрипта написать

#!/bin/bash

Все вопросы - к вашему маинтейнеру.

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

>> $ for x in {1..1000000}; do /bin/true $x; done

я так делал архив tar -tzf backup.tgz *

ошибок не было. Просто в backup.tgz попали НЕ ВСЕ файлы. С тех пор юзаю циклы и xargs.

Так ведь я и намекаю, что в цикл можно пихать много. Осторожничать надо в тех местах, где кроется сисвызов exec.

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

>>>$ for x in {1..1000000}; do /bin/true $x; done

Так ведь я и намекаю, что в цикл можно пихать много. Осторожничать надо в тех местах, где кроется сисвызов exec.

разве в этом случае переполнение невозможно? ну я сейчас проверю...

drBatty ★★
()

Не занимайтесь глупостями

#!/bin/zsh

for i in book-*.pbm;cuneiform -l rus -o «$i».out «$i»

cat book-*.pbm.out>>book

rm -rf book*pbm*

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