【问题标题】:Create conditional bash script code创建条件 bash 脚本代码
【发布时间】:2017-09-06 18:36:47
【问题描述】:

我使用以下代码加载一些带有电子邮件的文本文件 并使用用户密码在系统中创建用户。 文本文件包含如下电子邮件

abc@gmail.com
BDD@gmail.com
ZZZ@gmail.com

如果名称带有大写,我将其转换为小写,我能够使其工作。 现在我需要支持另一个输入而不是电子邮件 例如

P123456
Z877777

但现在我不希望这种类型的输入将其转换为小写

有点像

if(emailpattern )
  convert to lower
else
  Not 

这是有效的代码,但我未能使其工作......

for user in $(cat ${users} | awk -F";" '{ print $1 }'); do
    user=$(echo ${user} | tr "[:upper:]" "[:lower:]")
    log "cf create-user ${user} ${passwd}"
    #Here we are creating email user in the sys
    cf create-user ${user} ${passwd} 2>&1 |
    tee -a ${dir}/${scriptname}.log ||
    { log "ERROR cf create-user ${user} failed" ;
    errorcount=$[errorcount + 1]; }
done

【问题讨论】:

  • 有些事情不清楚(对我来说)...您是否在同一个文件中混合了电子邮件地址和姓名(例如,P123456)?您的示例代码中${users} 的值是多少? ${password} 来自哪里?您想为各种类型的输入数据生成哪些实际 (bash) 命令?
  • @markp - 可以混合,但可以只是电子邮件或只是名称...,用户是文件的内容,密码是一个常数
  • @john,请注意${user}"$user" 非常不同——you want to use the latter syntax

标签: regex linux bash shell unix


【解决方案1】:

你可以使用:

while IFS= read -r user; do
    # convert to lowercase only when $user has @ character
    [[ $user == *@* ]] && user=$(tr "[:upper:]" "[:lower:]" <<< "$user")

    log "cf create-user ${user} ${passwd}"

    cf create-user ${user} ${passwd} 2>&1 |
    tee -a ${dir}/${scriptname}.log ||
    { log "ERROR cf create-user ${user} failed" ;
    errorcount=$[errorcount + 1]; }

done < <(awk -F ';' '{ print $1 }' "$users")

【讨论】:

  • 谢谢,我试过了,我得到了错误awk: can't open file users,你知道吗?
  • 立即尝试。抱歉文件名应该是:"$users"
【解决方案2】:

假设:

  • 输入文件由电子邮件地址或姓名组成,每个都在单独的一行中
  • 电子邮件地址将被转换为小写
  • 名称保持原样(即不转换为小写)
  • log/cf/tee/errorcount 代码的所有功能都可以根据需要发挥作用

示例输入文件:

$ cat userlist
abc@gmail.com
BDD@gmail.com
ZZZ@gmail.com
P123456
Z877777

我们将首先使用awk 有条件地将电子邮件地址转换为小写:

$ awk '/@/ {$1=tolower($1)} 1' userlist
abc@gmail.com
bdd@gmail.com
zzz@gmail.com
P123456
Z877777
  • 首先我们将通过awk 运行输入文件 (userlist) ...
  • /@/:用于包含电子邮件地址的行(即包含@)...
  • $1=tolower($1) :将电子邮件地址(字段#1)全部转换为小写,然后...
  • 1:所有记录都为真,暗示print所有输入输出

现在将awk 输出通过管道传送到while 循环以执行其余操作:

awk '/@/ {$1=tolower($1} 1}' userlist | while read user
do
    log "cf create-user ${user} ${passwd}"
    #Here we are creating email user in the sys
    cf create-user ${user} ${passwd} 2>&1 | 
    tee -a ${dir}/${scriptname}.log ||
    { log "ERROR cf create-user ${user} failed" ;
      errorcount=$((errorcount + 1)) ;
    }
done
  • 更新为正确地将 errorcount 增加 1

【讨论】:

    【解决方案3】:

    bashcan lower-case text:

    while IFS= read -r line; do 
        [[ $line == *@* ]] && line=${line,,}
        # do stuff with "$line"
    done
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-09-05
      • 1970-01-01
      • 2013-10-02
      • 2013-01-19
      • 2021-08-29
      • 1970-01-01
      • 2018-11-12
      • 1970-01-01
      相关资源
      最近更新 更多