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

Как переменная окружения.

Это означает, что любой дочерний процесс, запускаемый дочерним процессом, также наследует переменную.

Тестирование:

$ export FOO=bar
$ sh
$ sh
$ sh
$ echo "$FOO"
bar
$ exit
$ exit
$ exit

Выше оболочка, создающая переменную окружения FOO, запускает новую интерактивную оболочку. Тот начал другой, а тот начал другой. Внутри этой великой -внучатой ​​оболочки $FOOимеет значение bar.

Еще один тест, показывающий, что если подоболочка изменяет переменную среды, это изменение переносится на более поздние подоболочки (, но не распространяется на родительские оболочки):

$ export FOO=bar
$ ( ( echo "$FOO"; FOO=quux; ( ( ( echo "$FOO" ) ) ) ) )
bar
quux
$ echo "$FOO"
bar

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

Обратите внимание, что переменные среды доступны любому процессу, запущенному из оболочки, а не только сценариям оболочки. Для программы C или awkскрипта не имеет смысла наследовать их как переменные оболочки, поскольку в этих языках не существует концепции таких переменных (переменные среды являются строго ключевыми -парами значений, тогда как переменные оболочки могут быть введены как целые числа, только для чтения -, массивы, ассоциативные массивы и т. д., в зависимости от возможностей оболочки ).

0
24.11.2018, 22:56
2 ответа

Операторы bashдля изменения регистра переменных: ${var^^*}for на -верхний и ${var,,*}for на -нижний, поэтому:

#! /bin/bash -
die() { printf >&2 '%s\n' "$@"; exit 1; }
usage() { die "Usage:" "  $0 "{"lower upp","upper low"}"er [files]"; }

(( $# >= 2 )) || usage 
from=$1 to=$2; shift 2

[[ $from   =  @(upper|lower) ]] &&
[[ $to     =  @(upper|lower) ]] &&
[[ "$from" != "$to"          ]] || usage

shopt -s nullglob dotglob
IFS= ret=0

(( $# > 0 )) || set -- *[[:$from:]]*

for file do
  case $to in
    (upper) newfile=${file^^*};;
    (lower) newfile=${file,,*};;
  esac
  [[ "$file" = "$newfile" ]] ||
    echo mv -i -- "$file" "$newfile" ||
    ret=$?
done
exit "$ret"

Удалите echoпосле завершения тестирования.

0
28.01.2020, 04:08

Если это не домашнее задание, используйте Ларри Уоллаrename

  • rename 'y/A-Z/a-z/' *для преобразования в нижний -регистр.
  • rename 'y/a-z/A-Z/' *для преобразования в верхний -регистр.

Я не знаю, работает ли это для всех языков, но это пример в руководстве.

0
28.01.2020, 04:08

Теги

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