Как определить имя файла внутри оператора case - в оболочке unix? - PullRequest
0 голосов
/ 30 ноября 2009

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

while [ $# -gt 0 ]
    do

        case $1 in
            -l)     echo ls;;
            -L)     echo ls -l;;
            [a-z])  echo filename;;
            *)  echo usage
                exit 1;;
        esac

        shift
    done

Кроме того, как я могу включить в этот оператор case условие, которое будет реагировать на пустые $ 1? Если, например, скрипт вызывается без каких-либо параметров или имен файлов.

Ответы [ 5 ]

2 голосов
/ 30 ноября 2009

Вы можете сопоставить пустую строку с регистром '') или "").

Имя файла может содержать любой символ - даже странные, такие как символы, пробелы, символы новой строки и управляющие символы - поэтому пытаться выяснить, есть ли у вас имя файла, ища буквы и цифры, это не правильный путь сделать это. Вместо этого вы можете использовать тест [ -e filename ], чтобы проверить, является ли строка допустимым именем файла.

Кстати, вы должны поставить "$1" в двойные кавычки, чтобы ваш скрипт работал, если имя файла содержит пробелы.

case "$1" in
    '')     echo empty;;
    -l)     echo ls;;
    -L)     echo ls -l;;
    *)      if [ -e "$1" ]; then
                echo filename
            else
                echo usage >&2  # echo to stderr
                exit 1
            fi;;
esac
1 голос
/ 30 ноября 2009

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

0 голосов
/ 30 ноября 2009

Вам лучше попасть в регистр по умолчанию *) и там вы можете по крайней мере проверить, существует ли файл с [-e "$ 1"] ... если его нет, то повторить использование и выйти 1.

0 голосов
/ 30 ноября 2009

@ OP, как правило, если вы используете bash, для соответствия нечувствительности к регистру вы можете использовать shopt и установить nocasematch

$ shopt -s nocasematch

для проверки нуля в вашем выписке

case "$var" in
  "") echo "empty value";;
esac
0 голосов
/ 30 ноября 2009

вы найдете информацию на справочной странице bash, если вы ищете "Сопоставление с шаблоном" без кавычек. Это помогает: [a-zA-Z0-9] *) вы, вероятно, должны прочитать о сопоставлении с образцом, регулярных выражений и так далее. Кроме того, вы должны почтить подсказку Джона Кугельмана о двойных кавычках. В следующем фрагменте кода вы можете увидеть, как проверить, не передан ли какой-либо параметр.

#!/bin/sh

case "$1" in
    [a-zA-Z0-9]*)
        echo "filename"
    ;;
    "")
        echo "no data"
    ;;

esac
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...