스크립트를 작성하는 방법을 찾고 있습니다.
다음 패턴을 가진 3개의 파일이 있습니다.
DailyLoad_Cust.txt
DailyLoad_Credit.txt
DailyLoad_Account.txt
이러한 각 파일 에는 연결된 sub_system
.cust
cus_edw
credit
cred_edw
account
acc_edw
파일이 NAS 위치에서 사용 가능하고 0보다 큰 경우 ( 또는 )를 RunFeed.sh <<sub_system>>
가져와 실행하는 일반적인 로드 스크립트가 있습니다 .sub_system
cus_edw
cred_edw
acc_edw
count
이를 위해 사용할 수 있는 가장 좋은 접근 방식은 무엇입니까?
$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
현재 디렉터리에 있는 모든 파일에 해당하는 하위 시스템 문자열을 인수로 사용하여 실행한다고 가정합니다 ._edw
DailyLoad_*.txt
이름이 존재하는지 테스트하려면 -e
test를 사용하세요. 값 세트에 대해 이를 수행하려면 루프를 사용하십시오.
#!/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
-maxdepth
find
명령문이
if
누락되었으며 루프 끝에 누락되었습니다fi
.for
done
사용되지 않은 변수가 있고 값이 할당되지 않은 다른 변수를 사용합니다.
큰따옴표가 필요한 일부 확장은 인용하지 않습니다.
당신은 찾을 수 있습니다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