![为多个变量循环部分代码](https://linux22.com/image/196193/%E4%B8%BA%E5%A4%9A%E4%B8%AA%E5%8F%98%E9%87%8F%E5%BE%AA%E7%8E%AF%E9%83%A8%E5%88%86%E4%BB%A3%E7%A0%81.png)
我正在寻找一种构建脚本的方法。
我有 3 个具有以下模式的文件:
DailyLoad_Cust.txt
DailyLoad_Credit.txt
DailyLoad_Account.txt
这些文件中的每一个都有一个关联的sub_system
.例如,cust
有cus_edw
,credit
有cred_edw
,account
有acc_edw
。
有一个常见的加载脚本,如果文件在 NAS 位置可用并且具有> 0,则RunFeed.sh <<sub_system>>
该脚本采用sub_system
( cus_edw
、cred_edw
或) 并运行。acc_edw
count
我可以为此使用的最佳方法是什么?
$Var1="Cust"
$Var2="Credit"
$var3="Account"
SUB_SYSTEM="";
for i in $VAR1; do
NASFileCount=`find . -maxdepth l -type f -name "${var}*.txt" | wc -l
if [[ $NASFileCount -gt 0 ]] && $Var1=cust;then
Sub_System=cust_edw
sh RunFeed.sh $Var
在上面的方法中(这是原始的,到目前为止还没有运行),我如何为上面的所有变量运行循环?
谁能指导我,有什么更好的方法吗?我对 Unix 比较陌生,仍在学习中。
答案1
我们假设您希望使用与当前目录中存在的任何文件相对应的子系统字符串RunFeed.sh
作为参数来运行。_edw
DailyLoad_*.txt
要测试名称是否存在,请使用-e
测试。要对一组值执行此操作,请使用循环。
#!/bin/bash
for string in account credit cust; do
if [ -e "DailyLoad_${string^}.txt" ]; then
sh RunFeed.sh "${string}_edw"
fi
done
这里发生的是我们迭代三个字符串account
、credit
和cust
。对于 中的每个字符串$string
,我们测试名称是否DailyLoad_${string^}.txt
存在,其中${string^}
会将 中字符串的第一个字符大写$string
。
如果该名称存在,我们将运行RunFeed.sh
shell 脚本${string}_edw
作为唯一的参数。
如果您不仅想测试文件是否存在,还想测试文件是否非空,请在上面的测试中使用-s
代替。对于零长度的文件,测试将失败-e
。-s
您的代码中有几个基本语法错误。
分配给前缀为 的变量
$
。在某些混淆的情况下,这样做在语法上是有效的 shell 代码,但不会达到您的预期。一般来说,应该对变量名(variable=value
)进行赋值,而不是对变量的扩展()进行赋值。$variable=value
find
and周围的命令替换wc
缺少最后一个反引号。您正在使用
l
(ell) 而不是1
(one) 并带有-maxdepth
选项find
。该
if
语句缺少fi
,并且循环末尾for
缺少 it 。done
您有未使用的变量,并且使用从未分配值的其他变量。
您不引用一些需要双引号的扩展。
您可能会发现https://www.shellcheck.net/网站可以方便地清除 shell 代码中的语法错误。
答案2
我不完全确定这就是你的意思,如果我误解了你的意思,请发表评论。
首先:您可以使用数组并对它们进行迭代。
作为罗密欧·尼诺夫提到过,您可以将它与数组一起使用。考虑以下代码:
ARRAY_VALS={"Cust" "Credit" "Account"}
for value in "${ARRAY_VALS[@]}"; do echo $value; done
第二:子系统后缀
我假设您可能有多个后缀,但是子系统文件是用来做什么的?您实际上并没有在任何地方使用它。无论如何,您可以使用类似以下代码的内容来创建它:
SUB_SYSTEM=${value}"_edw"
或者,如果您需要查找全名:
SUB_SYSTEM=`find . -maxdepth l -type f -name "*${value}_edw.txt"`
第三:文件名
根据您的示例,您搜索带有“cust*”或“*cust”的文件吗?因为你说你的文件采用以下格式:“DailyLoad_Cust.txt”,意思是:“*cust”。但是,在这种情况下 - 您应该验证您是否只有所需的前缀(在本例中为:“DailyLoad”。例如,如果修改后的代码为:
NASFileCount=`find . -maxdepth l -type f -name "*${value}*.txt" | wc -l`
因此,如果需要,您可以使用 grep 对其进行过滤:
NASFileCount=`find . -maxdepth l -type f -name "*${value}*.txt"| grep "DailyLoad" | wc -l`
最终代码
我稍微改变了你的代码并添加了 fi (到和 if 条件)和完成(对于 for)。如果我理解有误请评论:
Var1="Cust"
Var2="Credit"
var3="Account"
ARRAY_VALS=($Var1 $Var2 $Var3) # Daclare an array
for value in "${ARRAY_VALS[@]}"; do # run the for loop
NASFileCount=`find . -maxdepth l -type f -name "*${value}*.txt" | wc -l`
if [[ $NASFileCount -gt 0 ]] && "$Var1"==cust;then
SUB_SYSTEM=${value}"_edw" # not used
sh RunFeed.sh "$SUB_SYSTEM" # Run subscript
fi
done