LINUX.ORG.RU

помогите записать basename в название файла на bash

 


0

1

есть два файла, например index.sh и file.sh

index.sh:

export PW=$(basename "$INDEX")

file.sh:

bzip2 "$HOME/$FILE/$PW-$FILENUM"

полное содержимое

index.sh:

#!/bin/bash

export MAX_FILESIZE=2500  # 1024 байта = 1 КБ
export NUMBER_OF_FILES=5

export HOME=/mnt/sda1
export SHA=www
export FILE=bzip2
export APPS=APPS


for INDEX in "$HOME/$SHA/"*
do
  "$INDEX" &
done

export PW=$(basename "$INDEX")

exit

file.sh:

#!/bin/bash 

# Это функция, которая делает «типа, записал»
tipa_write() {
    touch $1
    while [ "$(wc -c < $1 )" -lt $MAX_FILESIZE ]; do 
        grep "набор слов" "$HOME/$APPS/APPS" >> $1
        # тут логика твоего типазаписала
    done
}

# Это цикл, который делает «записал, сжал, удалил для $NUMBER_OF_FILES файлов
# с именами по номерам (в примере — от 1 до 100)
for FILENUM in $(seq $NUMBER_OF_FILES); do
    DATE=`date +%d-%m-%Y-%R:%S:%N`
    # пишем
    tipa_write "$HOME/$FILE/$PW-$FILENUM"
    # жмём
    bzip2 "$HOME/$FILE/$PW-$FILENUM"
    # удаляем непожатое
    rm -f "$HOME/$FILE/$PW-$FILENUM"
    # Копируем на USB   
    # ftp "root:root@192.168.1.1" "$HOME/$FILE/$PW-$FILENUM"*
    # удаляем пожатое с локалки
    # rm -f "$HOME/$FILE/$PW-$FILENUM"*
    # Пишем количество пожатых файлов
    echo $PW-$FILENUM >> "$HOME/$FILE/filenum.txt"
    
done



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

И что надо сделать?

Напиши, что на входе, что должно получиться на выходе.

Пока не понятно.

Исходя из названия темы вообще ничего не понятно.

basname и вернёт название файла, к которому он применён и смысла переименовывать этот же файл в тоже имя нет.

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

> Напиши, что на входе, что должно получиться на выходе.

я отредактировал, думаю по коду будет понятно

zte
() автор топика

export PW=$(basename «$INDEX»)

Используешь переменную снаружи цикла, в котором она объявлена.

Bfgeshka ★★★★★
()

Можно внутри самого file.sh сделать basename "$0" и никакие переменные не экспортировать

annulen ★★★★★
()

Ваш index.sh совершенно бестолков.

Никуда не применëнный последний export. В таком виде он совершенно бесполезен. export - это для передачи переменных окружения в запускаемый файл. Этот же скрипт не запускает абсолютно ничего после него.

И можно было бы ещё предположить что переменные будут использоваться в другом скрипте при запуске . index.sh, но exit в конце полностью делает бесполезным такое использование. Да и shebang в начале скрипта в таком случае не нужен бы был.

unDEFER ★★★★★
()
Последнее исправление: unDEFER (всего исправлений: 1)
Ответ на: комментарий от zte

Вообще не понятно. Я привык обращаться с башем совсем по другому. Вероятно многие тоже.

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

Уважаемый, я не буду гадать по твоей проблеме.

Если ты не можешь нормально описать проблему, что у тебя не получается русским языком - разбирайся сам.

Читать неграмотно написанные скрипты и пытаться понять что хотел сделать художник я тоже не буду.

Есть поговорка, что правильно сформулированный вопрос - это большая часть ответа.

Так вот потрудись русским языком в одно, два предложения описать свой вопрос.

kostik87 ★★★★★
()
Последнее исправление: kostik87 (всего исправлений: 1)

Ты уже полтора месяца пишешь скрипт на 30 строк. Может стоило выделить из них хотя бы неделю и выучить шелл?

Это гораздо эффективнее, чем тыкаться методом тыка (учитывая, что в твоём случае это занимает так долго) и выискивать ответы по форумам.

P.S. Непосредственного решения проблемуы не даю, потому что не понял её сути. Даже после редактирований.

CrX ★★★★★
()
Последнее исправление: CrX (всего исправлений: 1)
Ответ на: комментарий от Bfgeshka

Используешь переменную снаружи цикла, в котором она объявлена.

по сути я решил свою проблему в file.sh:

import PW=$(basename $INDEX, .sh)
на выходе получилось
root@OpenWrt:/mnt/sda1# bash index.sh
root@OpenWrt:/mnt/sda1# /mnt/sda1/www/akamulacia.sh: line 2: import: command not found
bzip2: Output file /mnt/sda1/bzip2/-1.bz2 already exists.
bzip2: Output file /mnt/sda1/bzip2/-2.bz2 already exists.
bzip2: Output file /mnt/sda1/bzip2/-3.bz2 already exists.
bzip2: Output file /mnt/sda1/bzip2/-4.bz2 already exists.
bzip2: Output file /mnt/sda1/bzip2/-5.bz2 already exists.
^C
ошибка already exists. потому что не может записать через косую / теперь вопрос как оставить только название akamulacia ?

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

по сути я решил свою проблему в file.sh:
import PW=$(basename $INDEX, .sh)

line 2: import: command not found

И какую проблему ты решил? В bash нет функции import!

sigurd ★★★★★
()
Последнее исправление: sigurd (всего исправлений: 2)
Ответ на: комментарий от sigurd

Как нет? Ужас, export есть, а import - нет. Хотя правильно, лучше продавать, т.е. отдавать на экспорт и зарабатывать деньги, чем получать импорт, т.е. закупать за заработанное.

У автора ещё и с английским, даже на базовом уровне, видимо, проблемы. Поэтому и не понимает, что делает и пишет.

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

оно что с импортом что без одно и тоже, непойму я уже и пакет coreutils-basename Full version of standard GNU basename utility. на openwrt поставил а оно не пляшет и что делать? оно если не одно так другое.

zte
() автор топика
Последнее исправление: zte (всего исправлений: 4)
Ответ на: комментарий от zte

При запуске скрипта запускается отдельная указанная через шебанг (#!/bin/bash) оболочка или отдельная копия той, оболочки, которая используется (из которой скрипт вызывается).

Поэтому твой export виден только в рамках этой отдельно запущенной командной оболочки. И после завершения скрипта через его вызов ./index.sh экспортированных переменных в основной оболочке уже нет.

Экспортировать переменную нужно в случае необходимости её видимости за пределами функций и других скриптах, в которые подключается скрипт из другого файла.

Если ты хочешь, чтобы экспортируемые переменные или функции, описанные в одном файле скрипта были видны в другом, то нужно использовать директиву source или символ ., т.е. source script.sh или . script.sh в другом скрипте или командной оболочке, текущей командной оболочке, из которой скрипт вызывается.

Только нужно убрать exit.

DATE=date +%d-%m-%Y-%R:%S:%N - не понятно зачем, если это планируется использовать в имени файла, то символ двоеточие Linux пропустит, при копировании на файловые системы Windows тоже скопируется, а открыться в Windows не сможет.

kostik87 ★★★★★
()
Последнее исправление: kostik87 (всего исправлений: 2)
Ответ на: комментарий от zte

и что делать? оно если не одно так другое.

Если из шаблона
"$HOME/$FILE/$PW-$FILENUM" получается
bzip2: Output file /mnt/sda1/bzip2/-1.bz2 already exists.,
то очевидно что PW не определена!
Нафига 10 раз заставлять bash вычислять переменную по шаблону? Один раз создай переменную, присвой ей значение, выведи значение переменной и используй далее ее до следующей итерации цикла.

for FILENUM ...
do
  F="$HOME/$FILE/$PW-$FILENUM"
  echo Обрабатываю файл $F
  ...
  bzip2 "$F"
  ...
done
sigurd ★★★★★
()
Последнее исправление: sigurd (всего исправлений: 2)

Ты достал свои баш-портянки невнятного назначения постить с левыми вопросами.

Во-первых выкинь баш, скрипты пишут на posix шелле. Во-вторых, если не умеешь - иди в Job и сформулируй там заказ на то, что тебе конкретно нужно, и тебе кто-нить всё сделает, потратив на всё меньше часа.

firkax ★★★★★
()
Последнее исправление: firkax (всего исправлений: 1)
Ответ на: комментарий от firkax

Во-первых выкинь баш, скрипты пишут на posix шелле.

Баш везде есть. Твой посикс сдох, нужно ориентироваться только на линукс и его api.

ox55ff ★★★★★
()
Для того чтобы оставить комментарий войдите или зарегистрируйтесь.