루프를 사용하여 Bash 코드를 동적으로 생성하고 생성된 대로 실행하는 방법

루프를 사용하여 Bash 코드를 동적으로 생성하고 생성된 대로 실행하는 방법

아래와 같이 Bash 스크립트에 줄 목록이 있습니다.

if [ ! -z "$clone01" ]; then git clone "$clone01"; fi
if [ ! -z "$clone02" ]; then git clone "$clone02"; fi
if [ ! -z "$clone03" ]; then git clone "$clone03"; fi
#      $clone01 .... through to ...  $clone60
if [ ! -z "$clone60" ]; then git clone "$clone60"; fi

숫자가 10보다 작으면 변수 끝에 선행 0이 중요합니다.

다양한 대체와 루프 등을 시도했습니다. 이 코드는 매우 반복적이며 60줄로 구성되어 있습니다.

이 코드를 동적으로 생성하고 실행하는 스크립트의 일부로 만들려면 어떻게 해야 합니까? 이 문제를 해결하는 가장 좋은 방법은 무엇입니까?

답변1

글쎄요, 그러지 마세요. 보기 흉해요. URL을 배열에 넣고 반복합니다.

urls=( http://this.git http://that.git )
for url in "${urls[@]}" ; do
    git clone "$url"
done

또는 한 줄에 하나씩 파일에 넣고 루프에서 해당 줄을 읽습니다. 여기서는 당신처럼 빈 줄을 방지하는 것이 유용할 수 있습니다. #as 주석으로 시작하는 줄을 무시할 수도 있습니다 .

while read -r url ; do
    if [ -z "$url" ] || [ "${url:0:1}" = "#" ]; then continue; fi
    git clone "$url"
done < file.with.urls

행 카운터도 원한다면 쉽게 추가할 수 있습니다.산술 확장.

답변2

이 작업을 수행 하는 데 사용하지 마십시오 eval. 더 나은 도구는가변 간접:

for i in clone{01..60}; do 
   [[ ${!i} ]] && git clone "${!i}"
done

[[ $var ]]와 같은 효과가 있습니다 [ ! -z "$var" ]. 60개의 변수에 60개의 값을 저장하는 것이 최선의 방법은 아니며 이를 위해 배열을 사용해야 할 수도 있습니다.

답변3

if를 이와 같은 for 루프로 포장해 보셨나요?

for i in clone{01..60}; do echo $i; done

그러면 다음과 같은 출력이 생성됩니다.

clone01
clone02
clone03
... clipped for length ...
clone60

그래서 이와 같은 것이 트릭을 수행하는 것 같습니다.

for i in clone{01..60}; do if [ ! -z $i ]; then git clone $i; fi; done

이에 대한 유용한 리소스:

http://tldp.org/HOWTO/Bash-Prog-Intro-HOWTO-7.html

http://tldp.org/LDP/abs/html/varsubn.html

관련 정보