공백을 사용하여 bash 인수를 단일 문자열로 결합


39

Bash 함수의 모든 인수를 각 인수를 구분하는 공백이있는 하나의 단일 문자열로 결합하려고합니다. 또한 문자열 전체에 작은 따옴표를 포함시켜야합니다.

여기 내가 지금까지 가지고있는 것이 있습니다 ...

$array=("$@")
str="\'"
for arg in "${array[@]}"; do
    let $str=$str+$arg+" "
done
let $str=$str+"\'"

분명히 이것은 효과가 없지만 이것을 달성 할 수있는 방법이 있는지 궁금합니다.

답변:


53

나는 이것이 당신이 원하는 것을한다고 믿습니다. 모든 인수를 공백으로 구분하여 하나의 문자열에 모두 작은 따옴표로 묶습니다.

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'

자, 이것은 훌륭하게 작동했고 내가 필요한 것을 정확하게했습니다. 인수를 사용하여 디렉토리를 이름에 공백이있는 디렉토리로 변경하려고합니다. 내가 궁극적으로 이것을 위해 필요한 것은 디렉토리에 단어가있는 경우 아포스트로피를 입력하지 않고도 디렉토리를 변경하는 함수를 만드는 것이 었습니다. 방금 시도한 것은 다음과 같습니다. cdm () {str = " '$ *'"cd $ str} str의 첫 번째 인수에만 액세스합니다. 예 : cdm test 2 결과 : 'test : 해당 파일 또는 디렉토리가 없습니다
Schwagmister

@ Schwagmister : 원하는 경우 (문자열) 변수에 저장할 수 있지만 특별히 그렇게 할 필요가 없다면 cd "$*"충분 하다고 생각 합니다.
Scott

@Schwagmister 작은 따옴표는 도움이되지 않습니다. cdm(){ str="$*"; cd "$str"; }또는 Scott이 제안한대로 시도하십시오 cdm(){ cd "$*"; }. 또한 $*연속 된 여러 공백을 단일 공백으로 바꿉니다. 디렉토리 이름에 연속 된 공백이나 탭 또는 줄 바꿈이 여러 개있을 경우 해당 문자 를 함수 로 전달 하기 전에 이스케이프 해야cdm 합니다.
John1024

따라서 test 2 trial 1과 같은 경우이 cd 명령이 올바르게 작동하려면 어떻게해야합니까? 또한 이것은 정말 감사합니다. @Scott
Schwagmister

@Schwagmister 가장 좋은 방법은 cdm다음과 같이 호출 할 때 명령 줄에 작은 따옴표를 넣는 것입니다 cdm 'test 2 trial 1'. 이것은 이상한 이름의 모든 매너를 처리합니다. 그러나 공백이 단일 공백으로 제한되는 한 다음과 cdm같이 실행될 수 있습니다 cdm test 2 trial 1.
John1024

5

생각보다 쉽습니다.

#!/bin/bash
array="${@}"

echo $array

chmod + x을 실행하십시오.

$ ./example.sh --foo bar -b az 
--foo bar -b az
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.