실시예 1

실시예 1

이 Linux 프로그램은 0에서 4까지 인쇄해야 합니다. 하지만 이 코드에서는 오류를 찾을 수 없습니다.

#!/bin/sh

a=0

while [ $a -lt 5 ]
do
    echo $a
    a='expr $a + 1'
done

실행하려고 하면 "Line 5: [:Too Many Arguments"라는 메시지가 나타납니다.

답변1

명령 대체를 위해 백틱을 사용할 수 있습니다.

a=`expr $a + 1`

답변2

저는 세 가지 예를 제공했습니다. 처음 두 개는 while루프가 있고 세 번째는 until루프가 있습니다. 첫 번째 예는 원래 예와 매우 유사한 구문을 사용하고, 세 번째 예는 카운터 최대값의 동적 설정과 한 번에 한 단어 전달을 반복하기 위한 배열(공백으로 구분된 인수)을 사용하므로 약간 더 복잡합니다. 이제 이것들은단순한이 예제는 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작성자가 소스 코드로 제공하고 GitHub를 통해 Code Climate에 통합되어 대부분의 배포판에서 사용 가능합니다 .
  • 위에서 피한 것처럼여기 링크자동 코드 검사와 함께 위에 표시된 두 루프 유형을 모두 사용하는 예제 스크립트입니다. 그러나 스크립트의 의도는 위의 질문에 대답하는 것 이상이므로 이러한 호출을 활용하는 관련 함수를 찾으려면 "while" 및 "until"을 검색하세요.
  • bash != sh유사점은 있지만 차이점이 있습니다. 저는 개인적으로 bash가 더 나은 선택이라고 생각합니다. 왜냐하면 sh 스크립트가 주어지면 쉘이 bash 구문으로 이상한 일을 하기 때문에 잘못될 가능성이 적기 때문입니다.

답변3

'expr $a + 1'a에 문자열을 할당하고 있습니다 . 이것은 당신이 원하는 것이 아닐 것입니다. 작은따옴표를 백틱으로 변경하면 됩니다.

a=`expr $a + 1`

위 내용이 귀하의 질문에 답해 줄 것입니다. 다음은 몇 가지 추가 아이디어입니다.

구현이 Bash인 경우 대신 백틱 /bin/sh사용을 고려할 수도 있습니다 $(...). 여기에는 여러 가지 장점이 있습니다. 작은 따옴표와 백틱 사이의 인쇄상의 혼동을 방지하고, 양식을 $(...)중첩할 수 있으며, 각 중첩은 자체 인용 컨텍스트에 있습니다. 다음을 수행할 수 있습니다.

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

또 다른 구현은 다음과 같습니다.

#/bin/bash

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

이는 sh구현이 아닙니다. 따라서 귀하의 질문에 안전하게 답변하려면 귀하의 의도에 POSIX 이식성이 포함되어 있는지 또는 , 등과 같은 특정 구현에 관심이 있는지 Bash알아야 합니다 dash.tcsh

관련 정보