bash 인수를 공백이 포함된 단일 문자열로 연결합니다.

bash 인수를 공백이 포함된 단일 문자열로 연결합니다.

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개의 하위 질문이 있습니다.

  1. 연결하다대량으로매개변수를 문자열에 입력합니다.
  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[@]}

두 구문 모두 배열의 모든 값에 액세스하고 동일한 결과를 생성할 수 있도록 해줍니다.확장 프로그램에서 참조하지 않는 한. 이 경우에는 차이가 있습니다. 첫 번째 경우 @를 사용하면 확장 시 배열의 각 요소에 대한 단어가 생성됩니다.

그리고 을 사용하면 *확장 중에 전체 배열이 하나의 매개변수로 그룹화됩니다.

관련 정보