함수의 모든 매개변수 연결/변수의 모든 공백 제거

함수의 모든 매개변수 연결/변수의 모든 공백 제거

함수의 모든 매개변수를 연결하는 좋은 방법은 무엇입니까?

지금 내가 얻는 것은 그것들을 반복하고 연속적으로 추가하는 것입니다.

func(){
concat=
for arg in "$@"
do
    concat=$concat$arg
done
echo $concat
}

나는 비슷한 것을 하고 싶다:

another_func() {
echo $(remove_spaces $@)
}

답변1

concat () (
    IFS=''
    printf '%s\n' "$*"
)

이 함수는 위치 인수(인수)의 값이 구분 기호로 첫 번째 문자의 값과 연결되는 "$*"단일 문자열로 확장되는 (큰따옴표가 중요함)을 사용합니다.$IFS

이를 IFS빈 문자열로 설정합니다. 즉, "$*"모든 인수가 구분 기호 없이 연결된다는 의미입니다.

$IFS또한 ( ... )일반적인 { ... }.

다른 함수 내에서 이 함수를 호출하는 것은 다음과 같습니다.

other_func () {
    printf '%s\n' "$( concat "$@" )"
}

또는 실제로 함수를 호출하지 않고 더 짧게 만들 수도 있습니다 concat.

other_func () {
    ( IFS=''; printf '%s\n' "$*" )
}

인수 목록에서 모든 공백을 제거하려면 다음을 사용하십시오.

printf '%s\n' "$*" | tr -d ' '

예를 들어,

concat_delete_sp () {
    printf '%s\n' "$*" | tr -d ' '
}

시험:

$ concat 1 2 3 "h h h" o o o
123h h hooo
$ concat_delete_sp 1 2 3 "h h h" o o o
123hhhooo

답변2

두 번째 예의 접근 방식을 기반으로 리소스가 거의 없는 빠른 솔루션의 경우:

func(){
  a=$@;echo ${a// /}
}

이렇게 하면 모든 공백이 제거됩니다. 그러나 공백이 포함된 매개변수를 사용하려는 경우 @kusalananda의 접근 방식을 기억하세요.

답변3

zsh셸 에서는 j:separator:매개변수 확장 플래그를 사용하여 배열 요소를 구분 기호로 연결할 수 있습니다. 그래서 당신은 이것을 할 수 있습니다 :

concat=${(j::)argv}

또는

concat=${(j::)@}

$argv$@이와 같이 전역 매개변수를 수정하지 않고도 배열 요소를 연결합니다 $IFS.

Bourne과 같은 쉘을 사용하여 인수를 인쇄하려는 경우 언제든지 다음을 수행할 수 있습니다.

concat() {
  printf %s "$@" || return
  [ "$#" -eq 0 ] || printf '\n' # empty output if no argument
}

및 의 내장 함수는 printf결과를 변수에 저장할 수도 있습니다.bashzsh

printf -v variable %s "$@"

fish셸을 통해 다음을 사용할 수 있습니다.

echo -s -- $argv

(빈 리스트인 경우 빈 줄이 인쇄됩니다 $argv.)

관련 정보