while 루프를 조건부로 어떻게 공급합니까?

while 루프를 조건부로 어떻게 공급합니까?

나는 다음과 같은 스크립트를 가지고 있습니다 Compare.sh:

function Compare()
{
    echo 'Comparing here'
}

while read Dependency; do  
    
    Org=$(echo $Dependency | cut -d'/' -f1)
    Repo=$(echo $Dependency | cut -d'/' -f2)

    echo "Comparing $Repo ...";
    Compare $Repo
    
done <<< "$({ cat "$PWD/Dependencies"; echo; })"

콘텐츠는 Dependencies종속성 목록입니다.

Infra/Logging
Infra/Geo
Infra/Accounts
Company/Services
Company/Employees

이 함수를 호출하면 파일을 ./Compare.sh읽고 Dependencies반복합니다.

그러나 이제는 하나의 항목만 매개변수로 제공할 수 있기를 원합니다. ./Compare.sh Infra/Accounts. 매개변수가 제공되면 이를 통해 반복하고 싶습니다. 기본적으로 한 번만 반복됩니다. 그렇지 않으면 파일을 읽어야 합니다 Dependencies.

의사코드:

 done <<< if $1 then $1 else "$({ cat "$PWD/Dependencies"; echo; })"

가능합니까?

답변1

한 가지 접근 방식은 스크립트에서 파일을 무시하는 것입니다.

#!/bin/bash

Compare () {
   # some code
}

while IFS=/ read -r Org Repo || [ -n "$Repo" ]; do
   printf 'Comparing "%s"\n' "$Repo"
   Compare "$Repo"
done

다음과 같이 호출할 수 있습니다.

$ ./script <Dependencies

또는 다음과 같습니다:

$ ./script <<<"Infra/Accounts"

또는 다음과 같습니다:

$ some-command | ./script

또는 다음과 같습니다:

$ ./script <<'END'
some/data
more/stuff
last/line
END

아니면 비슷한 방법이 많습니다.

이 스크립트의 루프는 /처음 두 개의 구분된 문자열을 변수로 읽고 Org스크립트 Repo의 표준 입력 스트림에서 읽습니다( 더 많은 문자가 Repo있더라도 줄의 나머지 부분을 가져옴). /이 상황을 피하기 위해 더미 변수를 추가 ). 입력 스트림에서 처리하려는 데이터를 전달하는 것은 사용자의 몫이며, 스크립트 자체는 이것이 어떻게 수행되는지 신경 쓰지 않습니다.

-necho종료되지 않은 마지막 줄이 있는 파일을 전달하는지 테스트하십시오 (질문의 스크립트에 데이터를 공급하여 확인하려는 것으로 보입니다 ).


파일을 읽고 싶다면 Dependencies,기본적으로, 명령줄 인수만 데이터로 사용하고(제공된 경우) 다음을 사용합니다.

#!/bin/bash

Compare () {
   # some code
}

if [ "$#" -eq 0 ]; then
    cat Dependencies
else
    printf '%s\n' "$@"
fi |
while IFS=/ read -r Org Repo || [ -n "$Repo" ]; do
   printf 'Comparing "%s"\n' "$Repo"
   Compare "$Repo"
done

즉, cat명령줄 인수가 없으면 파일이 표시되고, 그렇지 않으면 명령줄 인수가 별도의 줄에 인쇄됩니다. 어떤 작업을 수행하든 이 if문은 솔루션의 첫 번째 변형과 동일한 루프에 입력을 제공합니다.

이 스크립트를 다음과 같이 사용할 수 있습니다.

$ ./script

또는

$ ./script 'some/data' 'more/stuff' 'last/line'

두 번째 스크립트는 첫 번째 스크립트 주위의 래퍼로 작성될 수 있습니다 script1.

#!/bin/sh

if [ "$#" -eq 0 ]; then
    cat Dependencies
else
    printf '%s\n' "$@"
fi |
./script1

답변2

가능합니까?

아마도 (man bash) "매개변수 확장; 기본값 사용" 및 "명령 대체"를 사용할 수도 있습니다. 다음과 같은 것을 시도해보세요

for Dependency in ${1:-$(< Dependencies)}
  do echo $Dependency
  done

관련 정보