Intereting Posts
поиск нескольких строк в нескольких файлах внутри каталога и печать строки и соответствующего имени файла, где она была найдена Как определить, что ZCACHE работает на моем ящике? Не удалось запустить proftpd server debian 8 Как узнать, запущен ли программный рейд или правильно настроен Как использовать пленный портал в текстовом режиме? Использование rsync в cronjob при необходимости пароля Случайно удаленный файл / etc / redhat-release Не удается подключиться к Wi-Fi-сети с SSID, содержащим диакритические знаки Linux Mint – внешний привод, заставляющий мою файловую систему выглядеть полностью и давая мне ошибку «без пробелов на устройстве» sed – заменить строку содержимым файла Как предотвратить, чтобы мой CD-Ripper переписывал Неизвестный альбом, когда метаданные не могут быть найдены Как правильно установить Cmnd_Alias? Как отключить графическую оболочку? Есть ли у Linux что-то эквивалентное разрешениям Android? GNOME игнорирует естественную настройку прокрутки

Начальный сценарий

Эта программа Linux должна печатать от 0 до 4. Но я не могу найти ошибку в этом коде. Пожалуйста помоги.

#!/bin/sh a=0 while [ $a -lt 5 ] do echo $a a='expr $a + 1' done 

Когда я пытаюсь запустить его, он говорит: «Строка 5: [: слишком много аргументов». Пожалуйста помоги!

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

 a=`expr $a + 1` 

Я представил три примера, первые два – с циклами while а третий – с циклом while. Первый пример использует очень близкий синтаксис для вашего оригинала, третий – немного сложнее, поскольку он использует динамические настройки для максимального счетчика и массив для итерации, хотя слова (аргументы, разделенные пространством) передаются по одному. Теперь это простые примеры и предназначены для ответа на ваши прямые вопросы на языке сценариев 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 

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

 ./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 

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

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

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

 a=`expr $a + 1` 

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

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

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

Вот еще одна реализация:

 #/bin/bash declare -ia=0 while [[ $a -lt 5 ]]; do echo $a ((a++)) done 

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