LINUX.ORG.RU

Две переменные подряд в bash

 ,


0

1

Не знаю как точно сформулировать, поэтому покажу на примере.

Есть скрипт, необходимость которого есть проверка наличия определенного файла и создания оного в случае отсутствия.

[code]
#!/bin/bash
FILE=lock.file
PATH=/mnt/

if [ ! -f «$FILE» ]
then
touch $PATH$FILE
else
exit 0
fi
[/code]

И оно вылетает c ошибкой command not found.

Подозреваю что я сделал что-то не так в строке touch $PATH$FILE. Если да, то как мне указать путь и название файла, который нужно создать через переменные?

★★★

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

Хаха, вот это я тупанул. Нельзя было использовать $PATH в роли локальной переменной. Сменил на $MOUNTPATH и все заработало)

dvrts ★★★
() автор топика

учти, что это неатомарная процедура.

т.е. после того как ты проверил и перед тем как ты создашь файл, какой-то другой процесс (например, другая копия твоего же скрипта) может уже создать такой файл! это популярная проблема конкурентного программирования.

на шелле для атомарного «проверить и создать файл если его нет» я использую вот такую функцию:

function mkatomic
{
  file="$(mktemp)"
  mv -n "$file" "$1"
  if [ -e "$file" ]; then
    rm "$file"
    return 1
  fi
}

она вернет False если файл уже существует.

val-amart ★★★★★
()

Скрипт можно сделать короче:

test -f «$FILE» || touch $PATH$FILE

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

Это над удаленной и добавленной строкой 351 народ угорает? Не, ну бывает, что-то с толку сбивает и начинаешь бредить :) Я действительно как-то упустил сабж из виду, сорри.

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

иии? вероятно из одних и тех же юзнетов приплыло, трюк-то стар как мир :)

val-amart ★★★★★
()
Ответ на: комментарий от alozovskoy

А, усек :)
Ну, бывает же. Только компьютеры не ошибаются и работают круглосуточно.

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

И совсем правильно будет ${mountpath}${file}

touch "${mountpath}/${file}"

Лучше добавить разделяющую косую черту. Во-первых, будет работать не зависимо от того, оканчивается косой чертой mountpath или нет. Во-вторых, нагляднее. В-третьих, не принято оканчивать mountpath косой чертой.

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

да, вместо всего этого if'а. у тебя тогда будет

mkatomic "$FPATH/$FILE"
val-amart ★★★★★
()
Ответ на: комментарий от val-amart

mktemp может не сработать если tmp загажен весь лучше проверять

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