여러 변수에 대한 코드 부분 반복

여러 변수에 대한 코드 부분 반복

스크립트를 작성하는 방법을 찾고 있습니다.

다음 패턴을 가진 3개의 파일이 있습니다.

DailyLoad_Cust.txt
DailyLoad_Credit.txt
DailyLoad_Account.txt

이러한 각 파일 에는 연결된 sub_system.​​custcus_edwcreditcred_edwaccountacc_edw

파일이 NAS 위치에서 사용 가능하고 0보다 큰 경우 ( 또는 )를 RunFeed.sh <<sub_system>>가져와 실행하는 일반적인 로드 스크립트가 있습니다 .sub_systemcus_edwcred_edwacc_edwcount

이를 위해 사용할 수 있는 가장 좋은 접근 방식은 무엇입니까?

$Var1="Cust"
$Var2="Credit"
$var3="Account"

SUB_SYSTEM="";
for i in $VAR1; do

NASFileCount=`find . -maxdepth l -type f -name "${var}*.txt" | wc -l
if [[ $NASFileCount -gt 0 ]] && $Var1=cust;then
 Sub_System=cust_edw
    sh RunFeed.sh $Var

위의 방법(원본이며 지금까지 실행되지 않음)에서 위의 모든 변수에 대해 루프를 어떻게 실행합니까?

누구든지 나를 안내해 줄 수 있습니까? 더 좋은 방법이 있습니까? 저는 Unix를 처음 접했고 아직 배우고 있습니다.

답변1

RunFeed.sh현재 디렉터리에 있는 모든 파일에 해당하는 하위 시스템 문자열을 인수로 사용하여 실행한다고 가정합니다 ._edwDailyLoad_*.txt

이름이 존재하는지 테스트하려면 -etest를 사용하세요. 값 세트에 대해 이를 수행하려면 루프를 사용하십시오.

#!/bin/bash

for string in account credit cust; do
        if [ -e "DailyLoad_${string^}.txt" ]; then
                sh RunFeed.sh "${string}_edw"
        fi
done

여기서 일어나는 일은 세 개의 문자열 account, credit및 을 반복한다는 것입니다 cust. 의 각 문자열에 대해 문자열의 첫 번째 문자를 대문자로 표시 하는 $string이름이 존재하는지 테스트합니다 .DailyLoad_${string^}.txt${string^}$string

RunFeed.sh이름이 존재하면 쉘 스크립트를 ${string}_edw유일한 인수로 실행합니다 .

파일 존재 여부뿐만 아니라 비어 있지 않은지 여부도 테스트하려면 위 테스트에서 대신 사용하세요 -s. 길이가 0인 파일의 경우 테스트가 실패합니다 -e.-s


코드에 몇 가지 기본 구문 오류가 있습니다.

  • 접두사가 붙은 변수에 할당됩니다 $. 특정 난독화된 상황에서 이는 구문적으로 유효한 쉘 코드이지만 예상한 대로 작동하지 않습니다. 일반적으로 variable=value변수( $variable=value)의 확장보다는 변수명( )에 할당하는 것이 좋습니다.

  • find주변의 명령 대체 및 wc마지막 백틱이 누락되었습니다.

  • options 에 (one) l대신 (ell)을 사용하고 있습니다 .1-maxdepthfind

  • 명령문이 if누락되었으며 루프 끝에 누락되었습니다 fi.fordone

  • 사용되지 않은 변수가 있고 값이 할당되지 않은 다른 변수를 사용합니다.

  • 큰따옴표가 필요한 일부 확장은 인용하지 않습니다.

당신은 찾을 수 있습니다https://www.shellcheck.net/웹사이트에서는 쉘 코드의 구문 오류를 쉽게 정리할 수 있습니다.

답변2

무슨 뜻인지 잘 모르겠습니다. 제가 의도한 바를 잘못 이해한 경우 댓글을 달아주세요.

첫째, 배열을 사용하고 반복할 수 있습니다.

~처럼로미오 니노프언급했듯이 배열과 함께 사용할 수 있습니다. 다음 코드를 고려해보세요.

ARRAY_VALS={"Cust" "Credit" "Account"}
for value in "${ARRAY_VALS[@]}"; do echo $value; done

두 번째: 하위 시스템 접미사

접미사가 여러 개 있을 수 있다고 가정하지만 하위 시스템 파일은 무엇에 사용됩니까? 실제로는 어디에서도 사용하지 않습니다. 어쨌든 다음 코드와 같은 것을 사용하여 만들 수 있습니다.

SUB_SYSTEM=${value}"_edw"

또는 전체 이름을 찾아야 하는 경우:

SUB_SYSTEM=`find . -maxdepth l -type f -name "*${value}_edw.txt"`

세 번째: 파일 이름

귀하의 예에 따르면 "cust*" 또는 "*cust"가 포함된 파일을 검색하고 있습니까? 파일 형식이 "DailyLoad_Cust.txt"라고 말씀하셨기 때문에 "*cust"를 의미합니다. 그러나 이 경우 필수 접두사(이 경우 "DailyLoad")만 있는지 확인해야 합니다. 예를 들어 수정된 코드가 다음과 같은 경우:

NASFileCount=`find . -maxdepth l -type f -name "*${value}*.txt" | wc -l`

따라서 필요한 경우 grep을 사용하여 필터링할 수 있습니다.

NASFileCount=`find . -maxdepth l -type f -name "*${value}*.txt"| grep "DailyLoad" | wc -l`

최종 코드

코드를 약간 변경하고 fi(to 및 if 조건)와 완성(for for)을 추가했습니다. 제가 잘못 이해한 경우 댓글을 달아주세요.

Var1="Cust"
Var2="Credit"
var3="Account"

ARRAY_VALS=($Var1 $Var2 $Var3) # Daclare an array
for value in "${ARRAY_VALS[@]}"; do # run the for loop
    NASFileCount=`find . -maxdepth l -type f -name "*${value}*.txt" | wc -l`
        if [[ $NASFileCount -gt 0 ]] && "$Var1"==cust;then
            SUB_SYSTEM=${value}"_edw" # not used
            sh RunFeed.sh "$SUB_SYSTEM" # Run subscript
    fi
done

관련 정보