Тесты сценариев оболочки - PullRequest
0 голосов
/ 09 мая 2020

Уважаемые, мне нужно проверить аргумент, чтобы проверить, является ли он каталогом, обычным файлом или другими типами файлов, поскольку я знаю, что все, что не является каталогом, является файлом, поэтому я могу сделать тест, например

br@IBMLC0B2ZJL:/mnt/d/a343$ [ -f gg.sh ] && echo "file"
br@IBMLC0B2ZJL:/mnt/d/a343$ [ -d folder ] && echo "directory"

но я только что увидел вопрос, который требует проверить файл, нормальный ли файл или нет, есть ли идеи проверить это ??

Исходный вопрос: «Напишите сценарий оболочки, который принимает имя файла или каталога в качестве аргумента. Получите отчет сценария, если это обычный файл, каталог или другой тип файла. Если это обычный файл, выйдите со статусом выхода 0. Если это каталог, выйдите со статусом выхода 1. Если это файл другого типа, выйдите со статусом выхода 2. "

Ответы [ 2 ]

2 голосов
/ 09 мая 2020

Существуют различные тесты , которые вы можете применить в bash.

-f файл - это обычный файл (не каталог или файл устройства)

-d файл - это каталог

-b файл - это блочное устройство

- c файл является символьным устройством

-p файл представляет собой канал

-h файл является символом c ссылка

-L файл является символом c ссылка

-S файл является сокетом

-t файл (дескриптор) связан с терминальным устройством. Этот параметр теста можно использовать для проверки того, является ли stdin [-t 0] или stdout [-t 1] в данном скрипте терминалом.

Но из исходного вопроса, вам не нужно тестировать все это, только обычный и каталог, и все остальное, может быть, вот так?

#!/usr/bin/env bash

file="${1:-}"
[ -f "$file" ] && exit 0
[ -d "$file" ] && exit 1
exit 2
1 голос
/ 09 мая 2020

Должно получиться что-то вроде этого:

#!/bin/bash
if [ -z "$1" ]; then
   echo "Usage: $0 /your/test/target" && exit 123
elif [ -f "$1" ]; then
   echo "file" && exit 0
elif [ -d "$1" ]; then
   echo "directory" && exit 1
else
   echo "other type of file" && exit 2
fi

Пример:

root@debian10:~[0]# touch /tmp/test.file
root@debian10:~[0]# mkdir /tmp/test.dir
root@debian10:~[0]# mknod /tmp/ttyS0 c 4 64
root@debian10:~[0]# /tmp/test.sh
Usage: /tmp/test.sh /your/test/target
root@debian10:~[0]# /tmp/test.sh /tmp/test.file 
file
root@debian10:~[0]# echo $?
0
root@debian10:~[0]# /tmp/test.sh /tmp/test.dir/
directory
root@debian10:~[1]# echo $?
1
root@debian10:~[1]# /tmp/test.sh /tmp/ttyS0 
other type of file
root@debian10:~[2]# echo $?
2
...