Как переменная окружения.
Это означает, что любой дочерний процесс, запускаемый дочерним процессом, также наследует переменную.
Тестирование:
$ 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
скрипта не имеет смысла наследовать их как переменные оболочки, поскольку в этих языках не существует концепции таких переменных (переменные среды являются строго ключевыми -парами значений, тогда как переменные оболочки могут быть введены как целые числа, только для чтения -, массивы, ассоциативные массивы и т. д., в зависимости от возможностей оболочки ).
Операторы 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
после завершения тестирования.
Если это не домашнее задание, используйте Ларри Уоллаrename
rename 'y/A-Z/a-z/' *
для преобразования в нижний -регистр. rename 'y/a-z/A-Z/' *
для преобразования в верхний -регистр. Я не знаю, работает ли это для всех языков, но это пример в руководстве.