배열의 인수를 사용하여 명령 실행

배열의 인수를 사용하여 명령 실행

이라는 그래픽 프로그램이 있다고 가정해 보겠습니다 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 tabappzsh

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

관련 정보