使用 if else 条件更改目录

使用 if else 条件更改目录

下面是我的代码的一小部分摘录,以便您更好地了解我的问题。当目录中的每个文件进入循环时,将从文件名中提取 em 值,并将其与声明的 em 值进行比较,以执行下一个操作。执行我的代码后,我注意到我的第一个条件有效,但是当它从 Em1 目录中出来时,第二个条件没有得到更多验证,因为我打开了 Em2 目录,它是空的,同时我有具有 em2 值的文件。所以我想知道出了什么问题

em1="first"
em2="second"
for file in *;
do
em=$( echo "$file" | awk -F'[.-]' '{print $1}' )
if [[ "$em" == "$em1" ]];
 then
   cd Em1                    #directory to execute action
   month_range               #function for action
   cd_ret                    #function to come back to current directory
elif [[ "$em" == "$em2" ]];
  then
   cd Em2
   month_range
   cd_ret
else
  echo "Nothing to do"
fi
done

答案1

您需要在for循环头中使用变量的名称。您$file在原来的问题中使用了变量file的值。

你做的事情也有点复杂。要使用临时更改的工作目录运行命令,您可以使用子 shell。

( cd Em1 && month_range )

子 shell 外部的工作目录不受cd子 shell 内部的影响。目前尚不清楚您的cd_ret函数正在做什么,因此这是另一个可能的错误来源。如果你不能这样做,例如,如果month_range正在设置需要在原始范围内可见的变量,则使用

cd Em1 && { month_range; cd -; }

上面的代码将cd进入Em1,运行该month_range函数,然后cd返回,假设month_range不会进一步调用cd。如果month_range确实使用cd,则将当前工作目录保存在变量中并使用它。

wd=$PWD; cd Em1 && { month_range; cd "$wd"; }

上面假设month_range不更改或取消设置wd变量。

您的使用awk是有问题的,因为 Unix 上的文件名从技术上讲可能包含换行符。最好使用参数替换。

em=${file%%[.-]*}

$file上面的代码首先截掉值-.字符,并将结果字符串分配给变量em

这给你留下了以下内容:

em1=first
em2=second

for file in *; do
        em=${file%%[.-]*}

        if [ "$em" = "$em1" ]; then
                ( cd Em1 && month_range )
        elif [ "$em" = "$em2" ]; then
                ( cd Em2 && month_range )
        else
                echo 'Nothing to do'
        fi
done

或者

em1=first
em2=second

for file in *; do
        em=${file%%[.-]*}

        case $em in
                "$em1") ( cd Em1 && month_range ) ;;
                "$em2") ( cd Em2 && month_range ) ;;
                *) echo 'Nothing to do'
        esac
done

或者,根本不em提取$file

em1=first
em2=second

for file in *; do
        case $file in
                "$em1"[.-]*) ( cd Em1 && month_range ) ;;
                "$em2"[.-]*) ( cd Em2 && month_range ) ;;
                *) echo 'Nothing to do'
        esac
done

或使用bash语法,

em1=first
em2=second

for file in *; do
        if [[ $file == "$em1"[.-]* ]]; then
                ( cd Em1 && month_range )
        elif [[ $file == "$em2"[.-]* ]]; then
                ( cd Em2 && month_range )
        else
                echo 'Nothing to do'
        fi
done

如果这符合您的预期,则取决于month_range函数或脚本。

相关内容