LinuxForum.Fans
Тема

Пара вопросов по shell (очень срочно!)

Автор: deleted_user 7 сообщений 2771 просмотров
#50181

1. Есть текстовый файл, содержащий n строк. Нужно его считать в массив. Как это сделать?
2. Для вычленения имени файла пытаюсь использовать basename, но в имени пути имеются пробелы. basename на них затыкается. Как преодолеть эту проблему.

P.S. Это не тестовые вопросы, мне нужно очень срочно закончить один проект, а я заткнулся на этих двух вещах

#50198

1

text

array=()
i=0
while read -d $'\n' line
do
    array[((i++))]=$line
done < test.txt

2. У меня нормально работает.


$ basename "/home/milfoil/.wine/drive_c/Program Files/Common Files/Microsoft Shared/VGX/VGX.dll"
VGX.dll
#50260
admin написал:
У меня нормально работает.

Это из командной строки, а из shell? Например, в таком виде:

basename $i $ext

где $i - переменная цикла (строка), а $ext - расширение файла? То есть, в случае $i="/usr/local/where is it?/assa.txt при значении $ext=".txt" я хочу в результате получить "assa", а не "where"

#50308
Hvzh написал:
1. Есть текстовый файл, содержащий n строк. Нужно его считать в массив. Как это сделать?
2. Для вычленения имени файла пытаюсь использовать basename, но в имени пути имеются пробелы. basename на них затыкается. Как преодолеть эту проблему.

1) никак. не нужно использовать массивы для этой цели - они очень медленно работают.
2)

Hvzh написал:
basename $i $ext

где $i - переменная цикла (строка), а $ext - расширение файла? То есть, в случае $i="/usr/local/where is it?/assa.txt при значении $ext=".txt" я хочу в результате получить "assa", а не "where"
text
$ basename "$i"
assa.txt

лично я просто прогоняю файл через sed, причём в вашем случае можно прогнать даже не файл, а вывод ls.

Есть ещё вариант - использовать find, там есть ключик -printf, который позволит сразу получить нужные строчки. Без того, что-бы загонять список в файл, потом в массив, а потом его ковырять так, как это делаете вы...

Hvzh написал:
Это из командной строки, а из shell? Например, в таком виде:

это вы кавычки забыли поставить.
что-бы пробелы не мешались, надо либо заключать имя "в кавычки", но тогда мешаются многие другие спец-символы, либо в 'другие кавычки', но тогда переменные не раскрываются, либо поменть значение IFS, и тогда лексемы у вас будут делится не пробелами, а другими символами.

#50331
drBatty написал:
Без того, что-бы загонять список в файл, потом в массив, а потом его ковырять так, как это делаете вы...

Я бы с удовольствием, но мне нужно отобразить имя файла без расширения, поскольку нужно его в меню отобразить. Есть задача: существует некоторое количество итемов, это количество я заранее не знаю. Нужно отобразить все имена используя dialog.

#50347
Hvzh написал:
[quote=drBatty]Без того, что-бы загонять список в файл, потом в массив, а потом его ковырять так, как это делаете вы...

Я бы с удовольствием, но мне нужно отобразить имя файла без расширения, поскольку нужно его в меню отобразить. Есть задача: существует некоторое количество итемов, это количество я заранее не знаю. Нужно отобразить все имена используя dialog.[/quote]
Для таких случаев - выделение имени, расширения или любого поля - удобно использовать awk.

Пётр.

#50357

Peter,
Ага, или sed или perl. Я же написал -средствами shell

Войдите или зарегистрируйтесь, чтобы ответить.