Если я правильно понимаю ваши комментарии, у вас есть примерно следующий сценарий:
y
содержит некоторый текст x
не существует журнал
не существует (или вам все равно, если вы удалите его содержимое с помощью команды, которую я вам даю). Вы хотите, чтобы сообщение об ошибке об отсутствии файла x
и , содержимое файла y
было выгружено в файл log
, и вы также хотите, чтобы этот вывод отображался на вашем терминале.
Если все правильно, то вы хотите:
cat x y 2>&1 | tee log
(ПРИМЕЧАНИЕ. Если это не дает того, что вы хотите, отредактируйте свой вопрос , включив в него фактическое сообщение об ошибке, и четко объясните насколько он отличается от желаемого.)
Я привел три примера, первые два связаны с циклами , а
- с циклами до
. Первый пример использует синтаксис, очень близкий к вашему оригиналу, третий немного сложнее, поскольку он использует динамические настройки для максимума счетчика и массив для итерации, хотя слова (аргументы, разделенные пробелами) передаются по одному. Это простые примеры, предназначенные только для ответа на ваши прямые вопросы на языке сценариев Bash, если вам нужны более сложные примеры, см. Ссылку, прикрепленную к сценарию, который я поддерживаю на GitHub, для примеров вложенных циклов среди прочая техника-волшебство.
#!/usr/bin/env bash
let _counter=0
let _max="5"
while [ "${_counter}" -lt "${_max}" ]; do
echo "${_counter}"
let _counter=++
done
unset _counter
unset _max
./example_one.sh
1
2
3
4
5
#!/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
./example_two.sh "$(seq 1 5)"
## same output as example one
#!/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
./example_three.sh "$(seq 1 5)"
## same output as example one
shellcheck
, он доступен в большинстве дистрибутивов и в исходной форме от его авторов и интегрирован в Code Climate с помощью GitHub. bash
! = sh
есть сходства, но они разные, лично я считаю bash лучшим выбором, потому что он с меньшей вероятностью даст сбой при использовании сценария sh, где as shell будет делать странные вещи с синтаксисом bash. Вы присваиваете строку '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
и т.д.