Переменные как команды в сценариях удара

Итак, первая подсказка в коде - это оператор return. Это означает, что вас, вероятно, просят написать функцию, которая, учитывая некоторые value, проверяет, не превышает ли это значение 5.

Давайте определим его, используя ваш существующий код:

function isGreaterThan5(value) {
  let greaterThan5 = false;

  if (value > 5 ) {
    console.log("That is true");
  }

  return greaterThan5;
}

Итак, сейчас мы всегда собираемся вернуть false. Все, что вам нужно сделать, это переназначить значение greaterThanFive, если value > 5. Итак, вы можете просто сделать это в своем операторе if:

function isGreaterThan5(value) {
  let greaterThan5 = false;

  if (value > 5 ) {
    greaterThan5 = true;
  }

  return greaterThan5;
}

Теперь вы можете проверить свой код, вызвав функцию с различными значениями:

isGreaterThan5(1); // returns false
isGreaterThan5(5); // returns false
isGreaterThan5(6); // returns true

И мы закончили !

Мне интересно, что вас смутило использование let. Возможно, вы захотите прочитать больше о var , let и const .

23
задан Alan W. Smith 12 March 2016 в 12:48
поделиться

4 ответа

Просто не помещайте целые команды в переменные. Вы получите много хлопот, пытаясь восстановить указанные в кавычках аргументы.

Также:

  1. Избегайте использования имен переменных с прописными буквами в скриптах. Простой способ выстрелить себе в ногу.
  2. Не используйте обратных кавычек, вместо этого используйте $ (...), он лучше вкладывается.

#! /bin/bash

if [ $# -ne 2 ]
then
    echo "Usage: $(basename $0) DIRECTORY BACKUP_DIRECTORY"
    exit 1
fi

directory=$1
backup_directory=$2
current_date=$(date +%Y-%m-%dT%H-%M-%S)
backup_file="${backup_directory}/${current_date}.backup"

tar cv "$directory" | openssl des3 -salt | split -b 1024m - "$backup_file"
45
ответ дан 29 November 2019 в 01:05
поделиться

Я не уверен, но, возможно, стоит сначала запустить eval для команд.

Это позволит bash развернуть переменные $ TAR_CMD и тому подобное до их полной ширины (так же, как Команда echo работает с консолью, что, как вы говорите, работает)

Затем Bash во второй раз прочитает строку с развернутыми переменными.

eval $TAR_CMD | $ENCRYPT_CMD | $SPLIT_CMD 

Я только что выполнил поиск в Google, и эта страница выглядит так, как будто она может справиться с задачей. объясняя, зачем это нужно. http://fvue.nl/wiki/Bash:_Why_use_eval_with_variable_expansion%3F

6
ответ дан 29 November 2019 в 01:05
поделиться

Есть смысл помещать команды и параметры только в переменные.

#! /bin/bash

if [ $# -ne 2 ]
then
    echo "Usage: `basename $0` DIRECTORY BACKUP_DIRECTORY"
    exit 1
fi

. standard_tools    

directory=$1
backup_directory=$2
current_date=$(date +%Y-%m-%dT%H-%M-%S)
backup_file="${backup_directory}/${current_date}.backup"

${tar_create} "${directory}" | ${openssl} | ${split_1024} "$backup_file"

Вы можете переместить команды в другой исходный файл, чтобы вы могли повторно использовать одни и те же команды и параметры во многих сценариях. Это очень удобно, когда у вас много сценариев, и вы хотите контролировать, как все они используют инструменты. Поэтому standard_tools будет содержать:

export tar_create="tar cv"
export openssl="openssl des3 -salt"
export split_1024="split -b 1024m -"
4
ответ дан 29 November 2019 в 01:05
поделиться

Цитировать пробелы внутри переменных так, чтобы оболочка правильно интерпретировала их, сложно . Именно этот тип вещей побуждает меня стремиться к более сильному языку. Будь то Perl, Python, Ruby или что-то еще (я выбираю Perl, но это не всегда для всех), это просто что-то , которое позволит вам обойти оболочку для цитирования.

Это не так, что я » нам никогда не удавалось сделать это правильно с либеральными дозами eval, но только этот eval дает мне eebie-jeebies (становится совершенно новой головной болью, когда вы хотите принять пользовательский ввод и оценить его, хотя в этом случае вы будете брать вещи что вы написали и оценили это вместо этого), и что у меня начались головные боли при отладке.

С perl, как мой пример, я смог бы сделать что-то вроде:

@tar_cmd = ( qw(tar cv), $directory );
@encrypt_cmd = ( qw(openssl des3 -salt) );
@split_cmd = ( qw(split -b 1024m -), $backup_file );

Трудная часть здесь - это создание каналов, но немного IO :: Pipe , разветвление и повторное открытие stdout и stderr, и это неплохо. Кто-то скажет, что это хуже, чем правильно цитировать оболочку, и я понимаю, откуда они берутся, но для меня это легче читать, поддерживать и писать. Черт возьми, кто-то может взять тяжелую работу из этого и создать модуль IO :: Pipeline и сделать все это тривиальным; -)

1
ответ дан 29 November 2019 в 01:05
поделиться