![함수의 모든 매개변수 연결/변수의 모든 공백 제거](https://linux55.com/image/150415/%ED%95%A8%EC%88%98%EC%9D%98%20%EB%AA%A8%EB%93%A0%20%EB%A7%A4%EA%B0%9C%EB%B3%80%EC%88%98%20%EC%97%B0%EA%B2%B0%2F%EB%B3%80%EC%88%98%EC%9D%98%20%EB%AA%A8%EB%93%A0%20%EA%B3%B5%EB%B0%B1%20%EC%A0%9C%EA%B1%B0.png)
함수의 모든 매개변수를 연결하는 좋은 방법은 무엇입니까?
지금 내가 얻는 것은 그것들을 반복하고 연속적으로 추가하는 것입니다.
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
결과를 변수에 저장할 수도 있습니다.bash
zsh
printf -v variable %s "$@"
fish
셸을 통해 다음을 사용할 수 있습니다.
echo -s -- $argv
(빈 리스트인 경우 빈 줄이 인쇄됩니다 $argv
.)