이라는 그래픽 프로그램이 있다고 가정해 보겠습니다 app
. 사용 예: app -t 'first tab' -t 'second tab'
프로그램에서 두 개의 "탭"을 엽니다.
app
문제는 스크립트에서 명령을 실행하는 방법입니다( 즉, 매개변수 수가 다를 수 있는 경우 ).bash
생각해 보세요:
#!/bin/bash
tabs=(
'first tab'
'second tab'
)
# Open the app (starting with some tabs).
app # ... How to get `app -t 'first tab' -t 'second tab'`?
위의 스크립트에 동등한 것이 있기를 바랍니다 app -t 'first tab' -t 'second tab'
. 그런 bash 스크립트를 작성하는 방법은 무엇입니까?
편집: 질문은 인수 배열을 사용하여 즉석에서 명령줄 인수를 결합하는 방법을 묻는 것입니다.
답변1
"${array[@]}"
배열 항목을 다른 단어(매개변수)로 확장하여 배열에서 매개변수를 제공하는 것은 쉽습니다 . 로고만 추가하면 됩니다 -t
. 이를 위해 첫 번째 배열을 반복하고 전체 인수 목록에 대한 또 다른 배열을 구축하고 -t
그 과정에서 플래그를 추가할 수 있습니다.
#!/bin/bash
tabs=("first tab" "second tab")
args=()
for t in "${tabs[@]}" ; do
args+=(-t "$t")
done
app "${args[@]}"
하드코딩된 목록 대신 스크립트의 명령줄 인수를 가져오려면 "$@"
대신 사용하세요 ."${tabs[@]}"
답변2
tabs=("-t" "one tab" "-t" "second tab")
echo app "${tabs[@]}"
app -t one tab -t second tab
이제 원본 배열을 "-t" 플래그를 사용하여 배열로 변환해야 합니다. 이것이 전혀 문제가 되지 않기를 바랍니다.
답변3
다음을 사용하는 것이 더 쉽습니다 zsh
.
#!/bin/zsh -
tabs=(
'first tab'
'second tab'
)
app -t$^tabs
이는 app
다음과 같이 입력한 것과 같습니다.
app -t'first tab' -t'second tab'
rc
, es
그리고 fish
이를 암시적으로 수행합니다(zsh는 $^array
실제로 rc
's에서 영감을 얻었습니다 ^
):
그 껍질에는
app -t$tabs
똑같이 할 것입니다. zsh에서는 rcexpandparam
활성화 옵션을 사용하여 기본적으로 이 동작을 얻을 수도 있습니다 set -o rcexpandparam
.
${array[@]/pattern/replacement}
ksh93, bash 및 zsh에서는 ksh93의 연산자를 사용할 수도 있습니다 .
#! /bin/bash -
tabs=(
'first tab'
'second tab'
)
app "${tabs[@]/#/-t}"
각 요소의 (zero-width) 를 바꾸는 것으로 시작하므로 -t
실제로 -t
각 요소 앞에 추가합니다.
전화는 app
다음과 같습니다
app -t 'first tab' -t 'second tab'
상대적인
app -t'first tab' -t'second tab'
와 의 두 가지 매개변수 는 -t
다음과 같습니다 .first tab
app
zsh
app ${${:--t}:^^tabs}
사용${array1:^^array2}
배열 압축연산자, 여기서 ${:--t}
(의 최소 형태 ${var:-default}
)가 사용됩니다.대기줄첫 번째 배열입니다.
답변4
기본적으로 다음 bash
스크립트는 사이트가 포함된 파일을 한 줄씩 읽고 새 탭에서 각 사이트를 엽니다.
#!/bin/bash
while read line
do
xdg-open "$line"
done < /root/file
용법
./script.sh sites