Вопрос о сценарии оболочки

Если я правильно понимаю ваши комментарии, у вас есть примерно следующий сценарий:

  • файл y содержит некоторый текст
  • файл x не существует
  • файл журнал не существует (или вам все равно, если вы удалите его содержимое с помощью команды, которую я вам даю).

Вы хотите, чтобы сообщение об ошибке об отсутствии файла x и , содержимое файла y было выгружено в файл log , и вы также хотите, чтобы этот вывод отображался на вашем терминале.

Если все правильно, то вы хотите:

cat x y 2>&1 | tee log

(ПРИМЕЧАНИЕ. Если это не дает того, что вы хотите, отредактируйте свой вопрос , включив в него фактическое сообщение об ошибке, и четко объясните насколько он отличается от желаемого.)

-1
13.04.2019, 18:07
3 ответа

Я привел три примера, первые два связаны с циклами , а - с циклами до . Первый пример использует синтаксис, очень близкий к вашему оригиналу, третий немного сложнее, поскольку он использует динамические настройки для максимума счетчика и массив для итерации, хотя слова (аргументы, разделенные пробелами) передаются по одному. Это простые примеры, предназначенные только для ответа на ваши прямые вопросы на языке сценариев Bash, если вам нужны более сложные примеры, см. Ссылку, прикрепленную к сценарию, который я поддерживаю на GitHub, для примеров вложенных циклов среди прочая техника-волшебство.

Пример 1

#!/usr/bin/env bash
let _counter=0
let _max="5"
while [ "${_counter}" -lt "${_max}" ]; do
    echo "${_counter}"
    let _counter=++
done
unset _counter
unset _max

Пример выполнения 1 пример

./example_one.sh
1
2
3
4
5

Пример 2

#!/usr/bin/env bash
_arr_args=( "${@}" )
let _counter=0
let _max="${#_arr_args[@]}"
while [ "${_counter}" -lt "${_max}" ]; do
    echo "${_arr_args[${_counter}]}"
    let _counter=++
done
unset _counter
unset _max

Пример выполнения 2 примера

./example_two.sh "$(seq 1 5)"
## same output as example one

Пример 3 (бонус)

#!/usr/bin/env bash
_arr_args=( "${@}" )
let _counter=0
let _max="${#_arr_args[@]}"
until [ "${_counter}" = "${_max}" ]; do
    echo "${_arr_args[${_counter}]}"
    let _counter=++
done
unset _counter
unset _max

Пример выполнения 3 примера

./example_three.sh "$(seq 1 5)"
## same output as example one

Примечания для новых авторов сценариев Bash

  • искать встроенные переменные / массивы и правила подстановки; это сэкономит ваше время и усилия, а также избавит вас от ненужного подключения к другим программам.
  • найдите shellcheck , он доступен в большинстве дистрибутивов и в исходной форме от его авторов и интегрирован в Code Climate с помощью GitHub.
  • как ускользало от вышеупомянутого , вот ссылка на пример сценария, который использует оба типа цикла, показанные выше, а также автоматическую проверку кода. Однако намерение сценариев выходит далеко за рамки ответа на вышеуказанный вопрос, поэтому ищите «while» и «until», чтобы найти соответствующие функции, которые используют эти вызовы.
  • bash ! = sh есть сходства, но они разные, лично я считаю bash лучшим выбором, потому что он с меньшей вероятностью даст сбой при использовании сценария sh, где as shell будет делать странные вещи с синтаксисом bash.
2
29.04.2021, 00:09

Вы присваиваете строку 'expr $a + 1' строке a. Это вряд ли то, что вы хотите. Просто замените одинарные кавычки на обратные, и все получится:

a=`expr $a + 1`

Вышеизложенное должно ответить на ваш вопрос. Ниже приведены некоторые дополнительные соображения:

Если ваша реализация /bin/sh - Bash, вы также можете рассмотреть возможность использования $(...) вместо обратных кавычек. Это имеет несколько преимуществ: это позволяет избежать типографской путаницы между одинарной кавычкой и обратным знаком, форма $(...) может быть вложенной, и каждая вложенность находится в своем собственном контексте цитирования (поэтому вы можете делать такие вещи, как:

variable="$(somecommand -o "$file")"

Вот другая реализация:

#/bin/bash

declare -i a=0
while [[ $a -lt 5 ]]; do
   echo $a
   ((a++))
done

Обратите внимание, что sh не является реализацией. Поэтому, чтобы ответить на ваш вопрос безопасно, нам нужно знать, включает ли ваше намерение переносимость POSIX, или вас интересует конкретная реализация, такая как Bash, dash, tcsh и т.д.

0
29.04.2021, 00:09

Вы используете обратные кавычки для подстановки команд

a=`expr $a + 1`
4
29.04.2021, 00:09

Теги

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