Привет всем, мне нужно проверить, существует ли файл с помощью сценария оболочки. Я немного покопался и получил этот синтаксис, но я не уверен, почему он не работает. (пожалуйста, имейте в виду, что вы разговариваете с новичком)
Я обнаружил, что вы можете добавить -e, например, чтобы проверить, существует ли он, но я не понял, откуда взялись эти ярлыки или их имена.
#! /bin/bash
if [ "$#" = "1" ]
then
if [ -e $($1) ] && [ -f $($1) ]
then echo 'the file exists'
fi
fi
Документация по команде [
находится по адресу man7.org/linux/man-pages/man1/test.1.html.
Если у вас есть файл, но вы не знаете, является ли он текстовым файлом и какую кодировку символов нужно использовать для чтения, у вас есть потеря данных. Если вам нравится угадывать, вы можете сделать это с помощью таких инструментов, как file
. Примечание: file
может ответить одним из нескольких вариантов. Также обратите внимание: предположение основано на текущем содержимом файла. Если писатель обновит его позже, использование предположения, основанного на предыдущем содержании, может привести к ошибке или потере текста. И если вы обновите его, вы можете испортить его для других читателей.
Это я или вопрос о том, что файл является текстовым файлом, просто всеми проигнорирован?
#!/bin/bash
if [ "$#" == 1 ]; then
if [[ -e "$1" && -f "$1" ]]; then
echo 'The file exists';
fi
fi
Вы должны поместить каждое условное выражение && между символами [[ ]], иначе оно будет интерпретировано как выполнение в случае успеха.
Спасибо за ваш ответ, но если бы я хотел поставить, скажем, если ( (A и B) ИЛИ C), это было бы [[(A && B) || С ]] ?
@DjallelEddineBOUAKAZ if [[ -e "$1" && ( -f "$1" || $1 == "a" ) ]]; then...
#! /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
Большое спасибо, это именно тот человек, которого я ищу. Это действительно очень помогает
В идиоматическом Баше:
#!/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
Подробнее в Баш Руководство.
Вам нужно удалить
$( )
части. И цитата"$1"
.