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