내 사용 기능이 올바르게 구현되어 있나요? [폐쇄]

내 사용 기능이 올바르게 구현되어 있나요? [폐쇄]

명령으로 사용되는 여러 기능이 있고 ~/.bash_profile그에 대한 사용 기능도 만들었습니다.

제가 직접 개발한 사용기능이 제대로 구현되었는지 알고 싶습니다.

IFS=$'\n'

usageSliceArr() {
  if [ $# != 3 ]; then
      echo 'name, index 1, index 2'
      return 1
  fi
 }

slicearr() {
  if (usageSliceArr $1 $2 $3); then 
      declare -n name=$1
      declare -i fst=$2 lst=$3
      echo ${name[@]:fst:lst}
  fi
 }

답변1

  1. 변수를 사용할 때는 큰따옴표를 사용하세요. 그렇지 않으면 공백이 포함된 값을 전달하면 중단됩니다. 게다가 서브쉘도 필요하지 않습니다. 그러니 if (usageSliceArr $1 $2 $3); then넌 써야 해if usageSliceArr "$1" "$2" "$3"; then
  2. 문자열의 경우 -ne숫자를 비교하는 데 사용됩니다 .!=
  3. 있다는 것을 잊지 마세요.https://shellcheck.net/
  4. 변수를 사용할 때는 큰따옴표를 사용하세요.
  5. 코드가 자체 문서화되도록 작업을 수행하는 함수 내부에 사용법 메시지를 넣습니다.
  6. 오류 메시지 쓰기표준 에러대신에표준 출력
  7. 명령을 실행할 때만 사용할 수 $PATH있는 대신 쉘 스크립트에 있는 함수로 명령을 작성하는 것을 고려하십시오.~/.bash_profile
  8. 변수를 사용할 때 변수를 큰따옴표로 묶어야 한다고 언급했나요?

한 가지 방법은 다음과 같습니다.

########################################################################
# slicearr name index count
#
# Return <count> space-separated and tokenised elements from the <name>
# array starting at <index>
#
slicearr() {
    if [ $# -ne 3 ]
    then
        echo 'Usage: name index count' >&2
        exit 1
    fi

    declare -n name=$1
    printf "%s " "${name[@]:$2:$3}"; echo
}

상관관계공간 구분 및 토큰화절은 원래 코드에서도 작동합니다. 배열을 고려해보세요

a=( one two 'twenty three' )

"Twenty-3"은 단일 요소로 추출되지만 공백으로 구분된 두 개의 값 "Twenty"와 "Three"로 반환됩니다.

답변2

@StéphaneChezalas의 좋은 조언을 사용하여 지금 이 작업을 수행하겠습니다.

IFS=$'\n'

usageSliceArr() {
  if (( $# != 3 )); then
      echo 'name, index 1, index 2'
      return 1
  fi
 }

slicearr() {
  usageSliceArr $@ &&
    declare -n name=$1
    declare -i fst=$2 lst=$3
    echo ${name[@]:fst:lst}
 }

이 기능을 포함하여 제게는 많은 기능이 있으며 ~/.bash_profile이는 단지 일회성 스크립트가 아니라는 점을 명심하세요.

관련 정보