Bash 함수의 모든 매개변수를 문자열로 연결하고 각 매개변수를 공백으로 구분하려고 합니다. 또한 문자열 전체에 작은따옴표를 포함해야 합니다.
내가 지금까지 가지고 있는 것은 다음과 같습니다...
$array=("$@")
str="\'"
for arg in "${array[@]}"; do
let $str=$str+$arg+" "
done
let $str=$str+"\'"
분명히 이것은 작동하지 않습니다. 그러나 이것을 달성할 수 있는 방법이 있는지 궁금합니다.
답변1
나는 이것이 당신이 원하는 효과를 얻을 것이라고 믿습니다. 모든 매개변수를 공백으로 구분하고 작은따옴표로 묶은 문자열에 넣습니다.
str="'$*'"
$*
$IFS
기본적으로 공백인 첫 번째 문자로 구분된 모든 스크립트 인수를 생성합니다 .
큰따옴표로 묶인 문자열 내에서는 작은따옴표를 이스케이프할 필요가 없습니다.
예
위의 내용을 스크립트 파일에 넣어 보겠습니다.
$ cat script.sh
#!/bin/sh
str="'$*'"
echo "$str"
이제 예제 매개변수를 사용하여 스크립트를 실행합니다.
$ sh script.sh one two three four 5
'one two three four 5'
스크립트는 POSIX입니다. 와 함께 작동 bash
하지만 필수는 아닙니다 bash
.
변형: 공백 대신 슬래시로 연결
다음을 조정하여 공백을 다른 문자로 변경할 수 있습니다 IFS
.
$ cat script.sh
#!/bin/sh
old="$IFS"
IFS='/'
str="'$*'"
echo "$str"
IFS=$old
예를 들어:
$ sh script.sh one two three four
'one/two/three/four'
답변2
생각보다 쉽습니다.
#!/bin/bash
array="${@}"
echo $array
chmod +x를 누른 다음 실행하세요.
$ ./example.sh --foo bar -b az
--foo bar -b az
답변3
고쳐 쓰다 TL;DR, 사용
"'${array[*]}'"
분명히 말씀드리자면 복사할 생각은 없습니다이 답변. 방금 배열의 모든 값을 사용 @
하고 역참조하는 데 미묘한 차이가 있다는 것을 발견했습니다 .*
내부적으로는 $*
argv $@
목록을 참조하는 두 배열입니다.
문제의 관점에서 보면,
나는 모든 주장을 하나로 합치려고 노력하고 있습니다배쉬 기능입력하다단일 문자열각 매개변수를 공백으로 구분하십시오.
2개의 하위 질문이 있습니다.
- 연결하다대량으로매개변수를 문자열에 입력합니다.
- 연결된 문자열을 단일 인수로 쉘 함수에 전달합니다.
먼저 배열을 문자열로 연결합니다.
array=("$@")
str="'${array[@]}'"
# or
str="'${array[*]}'"
# or
str=\'"${array[*]}"\'
둘째, str
함수에 전달할 때 함수가 받는 인수의 개수를 세어보겠습니다.
#!/usr/bin/env bash
arr=(a b c d)
function count_args() {
echo '$#' $#
}
count_args "'${arr[@]}'"
count_args \'"${arr[@]}"\'
count_args "'${arr[*]}'"
count_args \'"${arr[*]}"\'
출력은 다음과 같습니다
$# 4
$# 4
$# 1
$# 1
arr[*]
배열을 쉘 함수의 1개 매개변수 로만 래핑합니다. 이유는 무엇입니까?
에서 인용Bash 스크립트에서 배열을 사용하는 방법, 나는 이것이 나에게 효과적이라는 것을 알았습니다.
echo ${array[*]}
echo ${array[@]}
두 구문 모두 배열의 모든 값에 액세스하고 동일한 결과를 생성할 수 있도록 해줍니다.확장 프로그램에서 참조하지 않는 한. 이 경우에는 차이가 있습니다. 첫 번째 경우 @를 사용하면 확장 시 배열의 각 요소에 대한 단어가 생성됩니다.
그리고 을 사용하면 *
확장 중에 전체 배열이 하나의 매개변수로 그룹화됩니다.