Структура Переменной сценария оболочки

От Вашей ssh сессии имейте Вас, пытался запуститься gnome-session? Вам просто нужен X-сервер, работающий на Вашем клиентском компьютере.

1
13.02.2013, 00:35
3 ответа

Когда Вы используете $() оболочка выполнит содержание в фигурных скобках как команда.
Нельзя использовать пробелы прежде/после того, как = символ.

Таким образом, Ваша команда будет как

SNAPSHOT=SnapshotIR$TODAY*.csv

или

SNAPSHOT=SnapshotIR${TODAY}*.csv

PS. Если необходимо сделать некоторые операции с этим, регистрирует на следующем шаге, лучше использовать for цикл как

for file in SnapshotIR${TODAY}*.csv ; do smth ; done

вызовите в случае, если у Вас есть несколько файлов, соответствующих Вашему шаблону, [ -f ${SNAPSHOT} ] конструкция возвратит ошибку как:

[ -f f* ] && echo ok
-bash: [: filename: binary operator expected
1
27.01.2020, 23:17

Не используйте пробелы вокруг = при присвоении переменных.

Кроме того, я не думаю, что Вы хотите включить что SNAPSHOT присваивают в $( ) поскольку это пытается выполнить его как команду.

На ноте стороны рассмотрите к нижнему регистру свои переменные.

Таким образом, то, что Вы хотите, может быть

today=$(date +"%m%d%Y")    
snapshot=SnapshotIR$today

if [ -f ${snapshot}*.csv ]
2
27.01.2020, 23:17
  • 1
    Остерегайтесь этого, если больше чем один файл соответствует ${snapshot}*.csv, весь ад вырвется на свободу. –  Gilles 'SO- stop being evil' 13.02.2013, 02:47
SNAPSHOT = $(SnapshotIR$TODAY*.csv)

У Вас не может быть пространства в присвоениях. Кроме того, $(…) замена команды: эта строка пытается выполниться SnapshotIR02122013_2239.csv как программа.

В ударе, ksh или zsh, наборе SNAPSHOT быть массивом, содержащим список соответствия именам файлов.

SNAPSHOT=("SnapshotIR$TODAY"*.csv)

Если нет никакого файла соответствия, шаблон оставляют нерасширенным. В ударе или zsh, набор nullglob опция получить пустой массив вместо этого. В ksh, помещенном ~(N) в начале шаблона (т.е. SNAPSHOT=(~(N)"SnapshotIR$TODAY"*.csv)). Можно затем протестировать, если были какие-либо файлы соответствия путем тестирования длины массива.

shopt -s nullglob
SNAPSHOT=("SnapshotIR$TODAY"*.csv)
if [ ${#SNAPSHOT} -eq 0 ]; then
  echo 1>&2 "No snapshot file for $TODAY"
  exit 2
elif [ ${#SNAPSHOT} -gt 1 ]; then
  echo 1>&2 "Multiple snapshot files for $TODAY, I don't know which one to pick"
  exit 2
fi
echo "The snapshot file is ${SNAPSHOT[0]}"

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

set_snapshot () {
  if [ $# -gt 1 ]; then
    echo 1>&2 "Multiple snapshot files for $TODAY, I don't know which one to pick"
    exit 2
  elif [ -e "$1" ]; then
     SNAPSHOT=$1
  else
    echo 1>&2 "No snapshot file for $TODAY"
    exit 2
  fi
}
set_snapshot "SnapshotIR$TODAY"*.csv
echo "The snapshot file is $SNAPSHOT"

(Отметьте то использование [ -e "$1" ] протестировать, оставили ли шаблону нерасширенные сбои в патологических случаях такой как [0-9] когда нет никакого файла, имя которого является единственной цифрой, но существует файл с 5 именами персонажа [0-9]. Этого не может произойти с только * или ? метасимволы, так как они соответствуют себе.)

Следующий подход работает в некоторой степени:

SNAPSHOT=SnapshotIR$TODAY"*.csv
if [ -e $SNAPSHOT ]; then …

Начиная с расширения $SNAPSHOT оставлен неупомянутым, это рассматривают как разделенный от пробела список подстановочных шаблонов, который в порядке здесь. Однако, если будет больше чем один файл соответствия, то соответствия будут рассматриваться как отдельные аргументы [ команда, и это вызовет синтаксическую ошибку. (С особенно обработанными именами файлов это могло даже вызвать неправильный результат.), Таким образом, я не рекомендую этот подход, это является слишком хрупким.

2
27.01.2020, 23:17
  • 1
    Спасибо за показ корректных методов. Первый пример должен использовать ${#snapshot[@]}, идеально (( ! ${#snapshot[@]} )), хотя в этом конкретном случае, тестирующем 0th элемент, даст иллюзию работы так или иначе. –  ormaaj 23.02.2013, 02:23
  • 2
    @ormaaj. В ksh и ударе, ${#foo} длина первого элемента массива. При контакте с массивом имен файлов, которые не могут быть пустыми, ${#foo} 0, только если массив пуст. –  Gilles 'SO- stop being evil' 24.02.2013, 02:32

Теги

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