Как я могу измениться ниже на верхнее использование (три) параметры?

Здравствуйте. Я знаю, что здесь существуют подобные темы, но быть честным я не нашел решение для своей проблемы. Я также проверил stackoverflow, но никакой результат.

  1. Я должен сделать сценарий удара, который будет менять имена файлов от ниже до верхнего ИЛИ от верхнего для понижения через параметры в командной строке. Таким образом, когда я вставил командную строку:

    ./bashScript, ниже верхний

    затем все файлы в каталоге должны измениться от ниже до верхнего регистра.

  2. Я должен также добавить 3-й параметр, который позволит мне изменить только один определенный файл. Так, например, я должен смочь включения командной строки:

    ./bashScript понижают верхнее имя файла

Я создал что-то вроде этого:

#!/bin/bash

if test "$1" = "lower" && test "$2" = "upper"
then
for file in *; do
    if [ $0 != "$file" ] && [ $0 != "./$file" ]; then
    mv "$file" "$(echo $file | tr [:lower:] [:upper:])";
    fi
fi
done

elif test "$1" = "upper" && test "$2" = "lower"
then
for file in *; do
if [ $0 != "$file" ] && [ $0 != "./$file" ]; then
mv "$file" "$(echo $file | tr [:upper:] [:lower:])";
fi
done
fi

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

Заранее спасибо.

0
задан 23 November 2018 в 12:42

2 ответа

Взгляните на это:

#!/bin/bash

if [[ "$1" == "lower" && "$2" == "upper" ]] ; then
    EXPRESSION="y/a-z/A-Z/"
elif [[ "$1" == "upper" && "$2" == "lower" ]] ; then
    EXPRESSION="y/A-Z/a-z/"
else
    echo "Usage:     $0 lower upper [file]     OR     $0 upper lower [file]"
    exit 1
fi


if [[ -z "$3" ]] ; then
    shopt -s dotglob
    rename "$EXPRESSION" ./*
else
    rename "$EXPRESSION" "$3"
fi

Необходимо обычно использовать [[ ... ]] двойные скобки для условных выражений в Bash. В них можно использовать, например. == выдерживать сравнение для строкового равенства (с обеими заключенными в кавычки сторонами), или && объединить два условия с логическим И.

Затем я решил использовать rename управляйте вместо своей конструкции с echo, tr и mv. Это берет "выражение Perl" в качестве первого аргумента и любого количества имен файлов (как, например, результат шарика оболочки) после этого и переименует все файлы соответствия соответственно.

Выражение Perl, которое изменяет все строчные буквы на имя к прописным буквам, например. y/a-z/A-Z/. y команда и означает переводить все символы. a-z нотация, которая соответствует всем строчным латинским символам, A-Z для верхнего регистра. В зависимости от аргументов сценария мы храним или выражение для преобразования в верхний - или в нижний регистр в переменной оболочки $EXPRESSION.

Затем мы проверяем, был ли третий аргумент сценария дан (-z условная проверка Bash, которая верна, если строка пуста). В противном случае мы звоним rename команда с нашим сохраненным выражением и a ./* как окружают шарик для соответствия всем файлам в текущем каталоге. dotglob опция оболочки, которую мы включили, прежде чем это удостоверяется, что это также соответствует скрытым файлам именам, которые запускаются с точки, иначе они были бы опущены. Однако, если третий аргумент сценария был дан, мы передаем тот как аргумент.

3
ответ дан 27 October 2019 в 02:21

Я думал, что добавлю свои два пенса, стоящие, немного отличающееся взятие на ответе Командующего Байта.

#! /bin/bash

case $1 in
upper)  
    # check second argument to process a file if one given or the whole directory
    if [[ $2 > '' ]] #check if the second parameter is used (filename)
    then
        if [ -f $2 ] #check if the file exists
        then
            mv "$2" "$(echo $2 |tr [:lower:] [:upper:])" 
        else
            echo "$2 does not exist"
        fi          
    else    
        # process the whole directory
        for file in * 
        do
                if [ $0 != "$file" ] && [ $0 != "./$file" ]
            then
                    mv "$file" "$(echo $file | tr [:lower:] [:upper:])"
                fi
        done
    fi;;
lower)
    # check second argument to process a file if one given or the whole directory 
    if [[ $2 > '' ]] 
    then
        if [ -f $2 ] #check if the file exists
        then
            mv "$2" "$(echo $2 |tr [:upper:] [:lower:])" 
        else
            echo "$2 does not exist"
        fi          
    else    
        #process the whole directory
        for file in *; 
        do
                if [ $0 != "$file" ] && [ $0 != "./$file" ]
            then
                    mv "$file" "$(echo $file | tr [:upper:] [:lower:])"
                fi  
        done
    fi;;

--help)
    echo "Usage: $0 lower to lowercase entire directory "
    echo "Usage: $0 uppper to uppercase entire dirctory "
    echo "Usage: $0 lower [file] or upper [file] for a specific file"
    exit 1;;
esac
0
ответ дан 27 October 2019 в 02:21

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

Похожие вопросы: