“$ {my_array [@] / # /-}”에서 / # /-는 어떤 유형의 작업입니까?


17

배열을 명령의 인수변환하는 것에 대한 대답은 무엇입니까? 다음 Bash 명령을 사용합니다.

command "${my_array[@]/#/-}" "$1"

나는 그 /#/-부분이 정확히 무엇을하는지 알아 내려고 노력하고 있습니다. 불행히도, 나는 그것을 무엇이라고 부를 지 모르므로 문서를 찾는 데 어려움을 겪고 있습니다. 배열 및 일부 웹 사이트의 Bash 매뉴얼 페이지 섹션을 살펴 보았지만 아무것도 찾을 수 없습니다.

답변:


24

이것은 쉘 매개 변수 확장 에서 패턴 교체의 인스턴스입니다 . ${parameter/pattern/replacement}확장 ${parameter}하여 첫 번째 인스턴스를 pattern로 바꿉니다 replacement. 이런 종류의 패턴과 관련하여 #특별합니다. 패턴을 매개 변수의 시작 부분에 고정시킵니다. 이 모든 결과의 결과 는 각 매개 변수의 시작 부분에 빈 패턴을 대체하여 각 값 my_array앞에 배열의 모든 값을 확장하는 것 -입니다.


2

예, 쉘 매개 변수 확장 에서 다음과 같은 패턴 대체입니다 .

${parameter/pattern/replacement}

그러나 첫 번째 이후의 첫 번째 문자 //또는 #또는 (반복) %이라는 특별한 의미를 갖는 경우 및 .allstartend

와:

$ str='one_#two_two_three_one'

단일 /인스턴스가 첫 번째 인스턴스를 대체합니다. 의 첫 번째 인스턴스 one:

$ echo "${str/one/x-x}"
x-x_#two_two_three_one

또는 첫 번째 경우 two:

$ echo "${str/two/x-x}"
one_#x-x_two_three_one

one끝에 인스턴스 :

$ echo "${str/%one/x-x}"
one_#two_two_three_x-x

의 모든 반복 two:

$ echo "${str//two/x-x}"
one_#x-x_x-x_three_one

one시작시 의 인스턴스 :

$ echo "${str/#one/x-x}"
x-x_#two_two_three_one

로 시작하는 문자열 #(인용 부호 #) :

$ echo "${str/\#two/x-x}"
one_x-x_two_three_one

그러나 # (인용되지 않은)을 그대로두면 변수의 시작 부분에 대체가 설정됩니다.

$ echo "${str/#/====}"
====one_#two_two_three_one

또한 매개 변수가 배열이면 모든 요소에서 대체가 수행됩니다.

$ str=( one two three )
$ echo "${str[@]/#/==}"
==one ==two ==three

문구는 비트가로 오해이다 #하고 %하면서 패턴의 일부 //는 다른 연산자 /와 동일한 패턴을 사용한다. 당신은 pattern='#x'; echo "${var/$pattern}"(또는 ${var//$pattern}) 가질 수 있지만 pattern=/x; echo "${var/$pattern}"와는 다릅니다 echo "${var//x}". 주의 #%의 결합 될 수 zsh있지만 bashksh.
Stéphane Chazelas
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.