скрипт оболочки для получения имен файлов из пути и сохранения в переменную в Ubuntu Linux

Вопрос или проблема

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

for file in "${PROJECT_DIR}/temp_namespaces"/*
do
    echo "${file##*/}"
    namespaces= "${file##*/}"
    echo "namespace = " > "${namespaces}"
done

Он выводит имя файла в первом echo, но после этого обе строки дают ошибку:

namespaces= "${file##*/}"                ----   команда не найдена
echo "namespace = " > "${namespaces}"    ----  Нет такого файла или каталога

Я использую linux, доступный на amazon/aws-cli, для выполнения вышеуказанного скрипта.

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

Любые указания будут признательны.

Спасибо

Странно, но я обнаружил, что скрипт заработал, когда я убрал пробел и кавычки из следующей строки:

namespaces= "${file##*/}"

и изменил ее на:

namespaces=${file##*/}

Убрав один пробел и кавычки, и это все.

Ответ или решение

Для извлечения имен файлов из заданного пути и сохранения их в переменной в Ubuntu Linux можно использовать оболочку (shell) и цикл. Ваша оригинальная проблема заключалась в синтаксических ошибках, которые вы допустили при присвоении значения переменной. В данном ответе приведу исправленный и детализированный пример, который обеспечивает правильное извлечение имен файлов и их сохранение в переменной.

Пример Shell-скрипта

#!/bin/bash

# Укажите путь к директории, откуда хотите извлечь имена файлов
PROJECT_DIR="/путь/к/вашей/директории/temp_namespaces"

# Проверяем, существует ли директория
if [ ! -d "$PROJECT_DIR" ]; then
    echo "Ошибка: директория не найдена."
    exit 1
fi

# Перебираем содержимое директории и обрабатываем каждый файл
for file in "$PROJECT_DIR"/*; do
    # Проверяем, является ли объект файлом
    if [ -f "$file" ]; then
        # Извлекаем имя файла без пути
        namespaces=${file##*/}

        # Печатаем имя файла для проверки
        echo "Имя файла: $namespaces"

        # Создаем или перезаписываем файл с именем файла и добавляем содержимое
        echo "namespace = $namespaces" > "$namespaces"
    fi
done

Объяснение кода

  1. Установка пути (PROJECT_DIR): Убедитесь, что вы правильный путь к директории, из которой хотите извлечь имена файлов. В примере указано, что это /путь/к/вашей/директории/temp_namespaces.

  2. Проверка наличия директории: Перед тем как продолжить, выполнен базовый контроль существования директории. Если директория не найдена, скрипт завершится с сообщением об ошибке.

  3. Цикл for: Используется для перебора всех файлов в указанной директории. Извлечение имен файлов выполняется с использованием конструкции file##*/, которая удаляет путь и оставляет только имя файла.

  4. Проверка на файл: Убедитесь, что объект является файлом, используя условие -f. Это предотвращает попытки обработки директорий как файлов.

  5. Печать имени файла: Для отладки выводится имя файла в терминал.

  6. Сохранение в файл: Записывает строку namespace = имя_файла в новый файл с именем, основанным на обработанном файле.

Частые ошибки

  • Пробел перед =: Если вы напишите namespaces= "${file##*/}", Bash будет интерпретировать это как команду, а не присвоение переменной. Правильный вариант — без пробела: namespaces=${file##*/}.

  • Кавычки: Вокруг имени переменной при присвоении они не нужны. Ошибки в этой части могут привести к неожиданным результатам.

Заключение

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

Оцените материал
Добавить комментарий

Капча загружается...