배열을 명령의 인수로 변환 하시겠습니까? 있습니다. my_array=(option1 option2 option3) 배열의 값을 옵션으로 사용하여 bash

명령의 “옵션”배열이 있습니다.

my_array=(option1 option2 option3)

배열의 값을 옵션으로 사용하여 bash 스크립트 에서이 명령을 호출하고 싶습니다. 그래서, command $(some magic here with my_array) "$1"이된다 :

command -option1 -option2 -option3 "$1"

내가 어떻게 해? 가능합니까?



답변

나는 평범한 bash방법을 선호합니다 :

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

그 이유 중 하나는 공백입니다. 예를 들어 다음과 같은 경우 :

my_array=(option1 'option2 with space' option3)

sed기반 솔루션에서 변환한다 -option1 -option2 -with -space -option3(길이 5) 그러나, 상기 bash팽창으로 변환한다 -option1 -option2 with space -option3(길이 여전히 3). 드물 긴하지만 때때로 이것은 예를 들어 중요합니다 :

bash-4.2$ my_array=('Ffoo bar' 'vOFS=fiz baz')
bash-4.2$ echo 'one foo bar two foo bar three foo bar four' | awk "${my_array[@]/#/-}" '{print$2,$3}'
 two fiz baz three

답변

배열에 있었고 공백으로 구분 된 문자열로 생각하고있었습니다. 이 솔루션은 그와 함께 작동하지만 배열이므로 manatwork의 솔루션 ( @{my_array[@]/#/-}) 과 함께하십시오 .


이것은 sed서브 쉘로 나쁘지 않습니다 . 정규식이 얼마나 쉬운지는 옵션에 대해 보장 할 수있는 것에 달려 있습니다. 옵션이 모두 하나의 “단어”( a-zA-Z0-9만)이면 간단한 시작 단어 경계 ( \<)로 충분합니다.

command $(echo $my_array | sed 's/\</-/g') "$1"

옵션에 다른 문자 (대부분 가능성이 있음 -)가있는 경우 조금 더 복잡한 것이 필요합니다.

command $(echo $my_array | sed 's/\(^\|[ \t]\)\</\1-/g') "$1"

^행의 시작과 [ \t]일치하고, 공백이나 탭과 \|일치하고, 측면 ( ^또는 [ \t]), \( \)그룹 ()을 일치시키고 \|결과를 저장하고 \<단어의 시작과 일치합니다. \1parens ( \(\)) 에서 첫 번째 일치 항목을 유지하여 교체를 시작하고 -물론 필요한 대시를 추가합니다.

그들은 당신과 함께 작동하지 않는 경우 gnu sed와 함께 작동, 알려주세요.

동일한 것을 여러 번 사용하는 경우 한 번만 계산하여 저장하는 것이 좋습니다.

opts="$(echo $my_array | sed 's/\(^\|[ \t]\)\</\1-/g')"
...
command $opts "$1"
command $opts "$2"

답변

[srikanth@myhost ~]$ sh sample.sh

-option1 -option2 -option3

[srikanth@myhost ~]$ cat sample.sh

#!/bin/bash

my_array=(option1 option2 option3)

echo ${my_array[@]} | sed 's/\</-/g'