Как проверить, существует ли файл и является ли он текстовым файлом?

Привет всем, мне нужно проверить, существует ли файл с помощью сценария оболочки. Я немного покопался и получил этот синтаксис, но я не уверен, почему он не работает. (пожалуйста, имейте в виду, что вы разговариваете с новичком)

Я обнаружил, что вы можете добавить -e, например, чтобы проверить, существует ли он, но я не понял, откуда взялись эти ярлыки или их имена.

#! /bin/bash
if [ "$#" = "1" ] 
then
    if [ -e $($1) ] && [ -f $($1) ] 
        then echo 'the file exists'
    fi

fi

Вам нужно удалить $( ) части. И цитата "$1".

melpomene 29.05.2019 09:55

Документация по команде [ находится по адресу man7.org/linux/man-pages/man1/test.1.html.

melpomene 29.05.2019 09:56

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

Tom Blodget 29.05.2019 16:37

Это я или вопрос о том, что файл является текстовым файлом, просто всеми проигнорирован?

Camion 10.12.2021 06:29
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
4
3 440
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

#!/bin/bash
if [ "$#" == 1 ]; then
    if [[ -e "$1" && -f "$1" ]]; then
        echo 'The file exists';
    fi
fi

Вы должны поместить каждое условное выражение && между символами [[ ]], иначе оно будет интерпретировано как выполнение в случае успеха.

Спасибо за ваш ответ, но если бы я хотел поставить, скажем, если ( (A и B) ИЛИ C), это было бы [[(A && B) || С ]] ?

Mohamed BOUAKKAZ 29.05.2019 10:28

@DjallelEddineBOUAKAZ if [[ -e "$1" && ( -f "$1" || $1 == "a" ) ]]; then...

sergiotarxz 29.05.2019 10:44
#! /bin/sh

FILE=$1    # get filename from commandline

if [ -f $FILE ]; then
    echo "file $FILE exists"
fi

См. прекрасную справочную страницу тестовых команд, встроенных в различные оболочки: man test; мужчина ш; человек

Вы также найдете много учебников для начинающих, которые очень хорошо это объясняют. Или см. справочное руководство по bash: https://www.gnu.org/software/bash/manual/bash.pdf

Большое спасибо, это именно тот человек, которого я ищу. Это действительно очень помогает

Mohamed BOUAKKAZ 29.05.2019 10:29
Ответ принят как подходящий

В идиоматическом Баше:

#!/usr/bin/env bash

if [[ -f "${1-}" ]]
then
    echo 'the file exists'
fi
  • Правильный шебанг
  • [[, а не [
  • -f подразумевает -e
  • Нет необходимости в точках с запятой или одноразовых переменных.

Имейте в виду, что это не говорит вам, является ли файл файлом текст. Единственное «определение» текстового файла в отличие от любого другого файла заключается в том, содержит ли он только печатные символы, и даже это не соответствует работе с символами UTF BOM и наборами символов, отличными от ASCII. Для этого вы можете посмотреть неавторитетный вывод file "${1-}", например:

$ file ~/.bashrc
/home/username/.bashrc: ASCII text

Подробнее в Баш Руководство.

Другие вопросы по теме