나는 다음과 같은 스크립트를 가지고 있습니다 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
있더라도 줄의 나머지 부분을 가져옴). /
이 상황을 피하기 위해 더미 변수를 추가 ). 입력 스트림에서 처리하려는 데이터를 전달하는 것은 사용자의 몫이며, 스크립트 자체는 이것이 어떻게 수행되는지 신경 쓰지 않습니다.
-n
echo
종료되지 않은 마지막 줄이 있는 파일을 전달하는지 테스트하십시오 (질문의 스크립트에 데이터를 공급하여 확인하려는 것으로 보입니다 ).
파일을 읽고 싶다면 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