Shell 脚本中具有多个 IF 条件的 For 循环

Shell 脚本中具有多个 IF 条件的 For 循环

首先,在/tmp/test文件路径中我有以下目录

amb
bmb
cmb

通过运行该find命令,我将在这三个目录中获取以下文件列表:

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

我试图list1使用for循环并根据文件类型从中获取每个文件,*.amb或者*.bmb特定*.cmb的 IF 应执行:

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/list1最好写成find */ -type f -print > /tmp/test/list1, 因为你已经标记了甚至比进一步减少到find */ -type f > /tmp/test/list1。但这会破坏奇怪的(但合法的)文件名。
  • 不推荐使用反引号,您应该改用反引号$( … )。但即便如此,包含空格和其他特殊字符的文件名也会被破坏。

答案2

在 bash 中使用 else if,又名 elif,例如:

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

相关内容