Как я могу добавить третий параметр в этот скрипт bash? - PullRequest
0 голосов
/ 23 ноября 2018

Я хочу добавить третий параметр, который будет изменять имя файла с верхнего на нижний ИЛИ нижний на верхний, но в этом третьем параметре я хочу указать, какое имя файла необходимо изменить?Что не так с этим скриптом?Заранее спасибо.

#!/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

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

Ответы [ 3 ]

0 голосов
/ 23 ноября 2018

Если я правильно угадываю, что вы хотите, попробуйте

#!/bin/bash

case $1:$2 in
 upper:lower | lower:upper ) ;;
 *) echo "Syntax: $0 upper|lower lower|upper files ..." >&2; exit 1;;
esac

from=$1
to=$2
shift; shift
for file; do
    mv "$file" "$(echo "$file" | tr "[:$from:]" "[:$to:]")"
done

. Это имеет явное преимущество в том, что допускает более трех аргументов, где первые два указывают операцию, которую нужно выполнить.

Обратите внимание также на то, как мы стараемся всегда заключать в кавычки строки, содержащие имя файлаСм. Также Когда обернуть кавычки вокруг переменной оболочки?

Фактически вышеупомянутый скрипт также должен работать с /bin/sh;мы не используем никаких функций Bash-only, поэтому он должен работать под любым POSIX sh.

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

#!/bin/bash

op=',,'
# XXX FIXME: do proper option parsing
case $1 in -u) op='^^'; shift;; esac

for file; do
    eval mv "\$file" "\${file$op}"
done

По умолчанию он преобразуется в нижний регистр и переключается в верхний регистр, если вы передаете -u перед именами файлов.

В обоих этих сценариях мы используем for file в качестве сокращения для for file in "$@", то есть перебираем (оставшиеся) аргументы командной строки.Возможно, это та деталь, которую вы искали.

0 голосов
/ 23 ноября 2018

Простите, если I сильно неправильно понял, но я думаю, что вы, возможно, неправильно поняли, как работает передача аргументов.

Именованные / пронумерованные аргументы представляют значения, которые вы передаете в командной строке в их порядковых позициях.Каждый может теоретически иметь любое значение, которое может застрять в строке.Вам не нужен третий параметр, только третье значение.

Давайте попробуем пример.

#! /bin/env bash

me=${0#*/} # strip the path
use="
   $me { upper | lower } file

   changes the NAME of the file given to be all upper or all lower case.

"
# check for correct arguments
case $# in
2) : exactly 2 arguments passed - this is correct ;;
*) echo "Incorrect usage - $me requires exactly 2 arguments $use" >&2
   exit 1 ;;
esac

declare -l lower action # these variables will downcase anything put in them
declare -u upper        # this one will upcase anything in it
declare newname         # create a target variable with unspecified case

action="$1"             # stored the *lowercased* 1st argument passed as $action
case $action in         # passed argument has been lowercased for simpler checking
upper) upper="$2"       # store *uppercased* 2nd arg.
       newname="$upper" # newname is now uppercase.
       ;;
lower) lower="$2"       # store *lowercased* 2nd arg.
       newname="$lower" # newname is now lowercase.
       ;;
    *) echo "Incorrect usage - $me requires 2nd arg to be 'upper' or 'lower' $use" >&2
       exit 1 ;;
esac

if [[ -e "$2" ]]        # confirm the argument exists
then echo "Renaming $2 -> $newname:"
     ls -l "$2"
     echo " -> "
     mv "$2" "$newname" # rename the file
     ls -l "$newname"
else echo "'$2' does not exist. $use" >&2
     exit 1
fi
0 голосов
/ 23 ноября 2018

Прежде всего, существует проблема с отступом в этом скрипте. Сначала проверьте, должно ли выполнено условие, прежде чем fi

Ниже приведено правильное значение.

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
  done
fi

Во-вторых, вопрос, который вы задали:

#/bin/bash -xe 

[ $# -ne 3 ] && echo "Usage: {lower} {upper} {fileName} " && exit 1 
if [ "$1" = "lower" ] && [ "$2" = "upper" ] && [ -f "$3" ]; 
then 
  mv "$3" "$(echo $3 | tr [:lower:] [:upper:])"; 
fi 

Надеюсь, это поможет.

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