Bash substitution в файле

Автор hexray, 11 февраля 2014, 19:55:56

« назад - далее »

0 Пользователи и 1 гость просматривают эту тему.

hexray

Здравствуйте. Возникла непонятка с подстановочными выражениями, которые по разному работают непосредственно из коммандной строки и из файла.

$ v=aaaaa.bbbbb
$ echo ${v%%*([^.])}
aaaaa.

Код удаляет конец строки до точки, или все если точки нет.
То же самое запишем и запихнем в файл:

$ cat test.sh
#!/bin/bash

v=aaaaa.bbbbb
echo ${v%%*([^.])}

$ ./test.sh
aaaaa.bbbbb

И все перестало работать. В чем проблема?

Graf

Чего-то твой код у меня и в консоли не работает

# v=aaaaa.bbbbb
# echo ${v%%*([^.])}
aaaaa.bbbbb


а вот так работает и в консоли и из файла

# v=aaaaa.bbbbb
# echo ${v%%.*}
aaaaa

hexray

#2
Странно, что не работает...
Ну такой упрощенный вариант echo ${v%%.*} конечно рабочий, но он не делает то что мне нужно. А нужна мне довольно простая вещь:
В переменной есть строка вида [aaaaa.]bbbbb. Соответсвенно мне нужно узнать как раз часть aaaaa - которая может быть и пустой (тогда точки не будет).
Вот то что я накрутил с помощью мана по башу, делало эту задачу в 2 этапа:
1 й который я и привел удаляет все данные с конца до точки.
2 й просто удалить точку в конце, если она есть v=${v%.}
А вариант ${v%.*} не даст нужного мне результата, так как для строки "bbb" и вернет "bbb", а должен вернуть пустоту.

Это я кстати выполнял не на слаке, а на openSUSE с башем "4.2.42(1)-release (x86_64-suse-linux-gnu)"

Graf

#3
Ничего не понял :wacko_mini:   :)
Давай задачу, а не метод решения рассмотрим на примере строки myfile.tgz ?
Что тебе от сюда надо вытащить?
И тебе надо решить ее только используя echo или чистый bash ?

У меня:

# bash --version
GNU bash, version 4.2.45(2)-release (i486-slackware-linux-gnu)

hexray

Моя строка это не имя файла, а имя таблицы в БД в виде:
[<Имя схемы>.]<Имя таблицы>
Вот мне и нужно узнать Имя схемы, которое может отсутсвовать. Пример:

"vasya.table1" => Schema = "vasya"
"Petya.contacts" => Schema = "Petya"
"money" => Schema = ""

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

Graf


vasya.table1
Petya.contacts
money



#! /bin/bash

file=$1
awk -F. '{if ($2=="") {print ("Shema=")} else {print ("Shema=")$1}}' $1



# ./shema.sh ./base.txt
Shema=vasya
Shema=Petya
Shema=


Или я опять не правильно понял?  :)

hexray

Да, спасибо. Это как раз то что нужно.