下面是我的代码的一小部分摘录,以便您更好地了解我的问题。当目录中的每个文件进入循环时,将从文件名中提取 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
Run Code Online (Sandbox Code Playgroud)
您需要在for循环头中使用变量的名称。您$file在原来的问题中使用了变量file的值。
你做的事情也有点复杂。要使用临时更改的工作目录运行命令,您可以使用子 shell。
( cd Em1 && month_range )
Run Code Online (Sandbox Code Playgroud)
子 shell 外部的工作目录不受cd子 shell 内部的影响。目前尚不清楚您的cd_ret函数正在做什么,因此这是另一个可能的错误来源。如果你不能这样做,例如,如果month_range正在设置需要在原始范围内可见的变量,则使用
cd Em1 && { month_range; cd -; }
Run Code Online (Sandbox Code Playgroud)
上面的代码将cd进入Em1,运行该month_range函数,然后cd返回,假设month_range不会进一步调用cd。如果month_range确实使用cd,则将当前工作目录保存在变量中并使用它。
wd=$PWD; cd Em1 && { month_range; cd "$wd"; }
Run Code Online (Sandbox Code Playgroud)
上面假设month_range不更改或取消设置wd变量。
您的使用awk是有问题的,因为 Unix 上的文件名从技术上讲可能包含换行符。最好使用参数替换。
em=${file%%[.-]*}
Run Code Online (Sandbox Code Playgroud)
$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
Run Code Online (Sandbox Code Playgroud)
或者
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
Run Code Online (Sandbox Code Playgroud)
或者,根本不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
Run Code Online (Sandbox Code Playgroud)
或使用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
Run Code Online (Sandbox Code Playgroud)
如果这符合您的预期,则取决于函数month_range或脚本。