【问题标题】:bash pass pairs of argument in case statementbash在case语句中传递参数对
【发布时间】:2018-02-01 15:39:49
【问题描述】:

我试图找到一种有效的方法来循环基于一对参数的动作,例如(a、b、c、d、e、f....等)和(1、2、3、4、5、......等)。该脚本应遍历给定的文件文件夹,查找匹配的文件名并采取相应的措施。但是,$dir1,$dir2,$dir3...etc 没有基于文件名的固定命名模式,我可以为每个循环动态生成。我有一个预定义的文件名字符串列表,以及它们对应的 hdfs 文件夹位置。

有人可以帮助提出更好的方法,以便我可以在循环中执行相同的操作,而不是为每种情况重写通用操作吗?

下面是一个示例伪代码 sn-p。
示例输入文件及其对应的目录:

BATMAN_JOKER_SUPERMAN.txt >>>  $dir1  
BATMAN_HARLEYQUIN_SUPERMAN.txt >>> $dir2  
BATMAN_DEADSHOT_SUPERMAN.txt>>> $dir3  

假设所有变量都已声明

for filename in $(ls $home_dir| grep $ProcessDate | grep global)  
do 
    fname=$(sed 's|`\(.*BATMAN_ *\)\(.*\)\( *_SUPERMAN.*\)$|\2|g' <<< $filename)  
    case "$fname" in  
    JOKER) 
    #lots of actions that are common to each file  
    hadoop fs -copyFromLocal $filename $dir1  
    ;;  
    HARLEYQUIN)  
    #lots of actions that are common to each file  
    hadoop fs -copyFromLocal $filename $dir2  
    ;;  
    DEADSHOT)  
    #lots of actions that are common to each file  
    hadoop fs -copyFromLocal $filename $dir3  
    ;;  
esac  
done;  

【问题讨论】:

  • 使用关联数组将文件名映射到目录。

标签: bash loops unix hadoop case


【解决方案1】:

你可以试试这个方法

case "$fname" in
  *JOKER*)
    ...
  ;;
  *HARLEYQUIN*)
    ...
  ;;
  *DEADSHOT*)
    ...
  ;;
esac

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-08-23
    • 1970-01-01
    • 2021-03-08
    • 1970-01-01
    • 2016-03-26
    • 1970-01-01
    • 1970-01-01
    • 2015-07-29
    相关资源
    最近更新 更多