쉘 스크립트에 여러 IF 조건이 있는 For 루프

쉘 스크립트에 여러 IF 조건이 있는 For 루프

먼저 /tmp/test파일 경로에 다음 디렉터리가 있습니다.

amb
bmb
cmb

이 명령을 실행하면 find이 세 디렉터리에 다음 파일 목록이 표시됩니다.

amb/eng/canon.amb
bmb/eng/case.bmb
cmb/eng/hint.cmb

list1루프를 사용하여 for파일 유형에 따라 각 파일을 가져오려고 합니다. 그렇지 *.amb않으면 *.bmb특정 *.cmbIF가 실행되어야 합니다.

cd /tmp/test
find */ -type f -exec ls {} \; > /tmp/test/list1
for file in `cat /tmp/test/list1`
do
if [ -f *.amb ]
then
sed "s/amb/amx/g" /tmp/test/list1 > /tmp/test/list2
ls /tmp/test/list2 >> /tmp/test/finallist
fi

if [ -f *.bmb ]
then
sed "s/bmb/bmx/g" /tmp/test/list1 > /tmp/test/list2
ls /tmp/test/list2 >> /tmp/test/finallist
fi

if [ -f *.cmb ]
then
sed "s/cmb/cmx/g" /tmp/test/list1 > /tmp/test/list2
ls /tmp/test/list2 >> /tmp/test/finallist
fi

done
echo "*********************"
echo -e "\nFinal list of files after replacing from tmp area"
felist=`cat /tmp/test/finallist`

echo -e "\nfefiles_list=`echo $felist`"

따라서 최종 출력은 다음과 같아야 합니다.

amx/eng/canon.amx
bmx/eng/case.bmx
cmx/eng/hint.cmx

답변1

파일 접미사에 따라 다른 작업을 적용하려고 하는 것 같습니다.

#!/bin/bash
while IFS= read -d '' -r file
do
    # amb/eng/canon.amb
    extn=${file##*.}

    case "$extn" in
    (amb)   finallist+=("${file//amb/amx}") ;;
    (bmb)   finallist+=("${file//bmb/bmx}") ;;
    (cmb)   finallist+=("${file//cmb/bmx}") ;;
    esac
done <( cd /tmp/test && find */ -type f -print0 2>/dev/null )

printf '*********************\n\n'
printf 'Final list of files after replacing from tmp area\nfefiles_list=%s\n' "${finallist[*]}"

그런데,

  • find */ -type f -exec ls {} \; > /tmp/test/list1find */ -type f -print > /tmp/test/list1이미 표시했으므로 을 작성하는 것이 좋습니다 .. find */ -type f > /tmp/test/list1​그러나 이는 이상한(그러나 합법적인) 파일 이름을 깨뜨립니다.
  • 백틱은 더 이상 사용되지 않으며 대신 백틱을 사용해야 합니다 $( … ). 하지만 그렇더라도 공백이나 기타 특수 문자가 포함된 파일 이름은 손상됩니다.

답변2

bash에서 elif라고도 알려진 else if를 사용하세요. 예를 들면 다음과 같습니다.

if [ $something ]; then
    echo "something"
elif [ $something_else ]; then
    echo "something_else"
elif [ $nothing ]; then
    echo "nothing"
else
    echo "no match"
fi

관련 정보