LINUX.ORG.RU
ФорумAdmin

Подскажите новичку - скрипт для оболочки BASH


0

1

1)   Подскажите, пожалуйста, как обрабатывать файлы в скрипте BASH, если имена этих файлов состоят из нескольких слов и содержат в себе пробелы. Файлов может и не быть в указанном месте.
Например, файл(ы) называе(ю)тся
   Скрипт для создания директории на диске.sh,
   Скрипт для создания файлов на диске.sh
и. т.п.
При выполнении скрипта

#!/bin/bash
cd $HOME
zraz=' Скрипт для создания*.sh'

if [ `ls $zraz | wc -l` -gt 0 ]
then
    echo 'УРЯЯЯ'
else
    echo 'НЕЕЕЕЕЕТ'
fi
появляется ругань когда нет файлов «Скрипт для создания*.sh»
ls: cannot access Скрипт\: No such file or directory
ls: cannot access для\: No such file or directory
ls: cannot access создания*.sh: No such file or directory


2) Какой командой (find, locate, ls), лучше производить поиск и вывод файлов для дальнейшей обработки в скрипте, чтобы можно с помощью переменных или других команд указать место поиска, образец для поиска и другие параметры?
Например, если известно, что файлы должны находиться в определенной директории и имеют что-то общее в имени или содержимом.
Если есть где-то примеры, пожалуйста, подскажите.

3) Какой командой можно узнать позицию искомого символа (подстроки) в строке с начала или с конца строки, а также длину строки (кол-во символов)?

4) Как можно создать командой mkdir папку, которая содержит пробелы в имени (состоит из нескольких слов) ?
Команда
d='fi\ se'; mkdir $d
создает 2 папки.
Как, вообще, можно обрабатывать папки имена которых состоят из нескольких слов (разделены пробелами)? Например, папки типа «папка с картинками_files», которые создает веб-броузер для веб-страниц на диске.

5) Какая команда позволяет дописывать (добавлять) в новую строку текстового файла данные в скрипте? Например есть цикл, проходит 10 итераций и в один и тот же текстовый файл дописывается в новую строку значение строчной переменной, т.е. будет всего 10 строк.


1) кавычки

2) find

3) —

4) кавычки

5) echo

GotF ★★★★★ ()

if [ `ls $zraz | wc -l` -gt 0 ]

Надо if [ `ls «$zraz» | wc -l` -gt 0 ]

2

find лучше.

3

mkdir «$d»

5

echo «Hello» > file

babusha ()

а также длину строки (кол-во символов)?

echo «Hello sd sdf sdf sdf sd» | ruby -e «puts STDIN.read.split(//).size»

babusha ()

1) [ `ls «$zraz» | wc -l` -gt 0 ]
2) find $where -iname $namepattern
grep -r $what $where
3) А зачем такое узнавать? Лучше сразу производить необходимые действия при помощи sed и т.п.
4) mkdir «$d»
5) echo something >> file; echo something >> file; cat file

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

if [ `ls $zraz | wc -l` -gt 0 ]

Надо if [ `ls «$zraz» | wc -l` -gt 0 ]

ls вообще-то сообщает об ошибке, если ничего не найдёт. Поэтому:

if ls "$zraz"
then ...

Другое дело, что с кавычками я наблюдаю прямо противоположную ситуацию. Может, на поведение bash влияет то, что он запущен из zsh?

vadim@gaendalf:/tmp/a$ ls -l
итого 0
-rw-r--r-- 1 vadim vadim 0 Мар  5 14:09 abcd1
-rw-r--r-- 1 vadim vadim 0 Мар  5 14:09 abcd ef
-rw-r--r-- 1 vadim vadim 0 Мар  5 14:09 abcd gh
vadim@gaendalf:/tmp/a$ ptrn='abc*'
vadim@gaendalf:/tmp/a$ ls $ptrn
abcd1  abcd ef  abcd gh
vadim@gaendalf:/tmp/a$ ls "$ptrn"
ls: невозможно получить доступ к abc*: Нет такого файла или каталога
vadim@gaendalf:/tmp/a$ echo $?
2
vadim@gaendalf:/tmp/a$

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

Надо понимать кто обрабатывает метасимвол «*». Ты думаешь что «ls», а на самом деле это дело bash'a

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

Да, я знаю, что за подстановки отвечает shell, а не запускаемая из него программа.
Но тогда я не понимаю:
1) Пробовали ли написавшие про двойные кавычки свои варианты?
2) Как, собственно, быть ТСу с пробелами в шаблоне?

Felagund ()

3) Какой командой можно узнать длину строки (кол-во символов)

d="moya stroka"
expr length "$d"

Правда сейчас обнаружил, что для кириллицы показывает неверно

4) Как можно создать командой mkdir папку, которая содержит пробелы в имени

d="fi se"
mkdir "$d"

5) Какая команда позволяет дописывать (добавлять) в новую строку текстового файла данные в скрипте?


Например:

for i in 1 2 3
do
    echo $i >> my_file.txt
done

Heretique ()
#!/bin/bash

cd $HOME

if [ `ls -1| grep 'Скрипт для создания'| wc -l` -gt 0 ]
then
    echo 'УРЯЯЯ'
else
    echo 'НЕЕЕЕЕЕТ'
fi

Или:

#!/bin/bash

cd $HOME

if `ls -1| grep -q 'Скрипт для создания'`
then
    echo 'УРЯЯЯ'
else
    echo 'НЕЕЕЕЕЕТ'
fi
Heretique ()
Ответ на: комментарий от Heretique

3) Какой командой можно узнать длину строки (кол-во символов)

Проще, наверное, так:

test="12345"
echo ${#test}
WiZ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.