下面是我的代码的一小部分摘录,以便您更好地了解我的问题。当目录中的每个文件进入循环时,将从文件名中提取 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
函数或脚本。