Arrays Bash对数组的写入/读取

Arrays Bash对数组的写入/读取,arrays,bash,if-statement,Arrays,Bash,If Statement,我在从下面的脚本显示数组时遇到问题(它显示距离密码过期还有多少天): 第一行是空的,有些是重复的。 这是数组问题,如简单cmd: echo $USER $DAYS 显示正确的值。问题是您尚未定义任何数组 #!/bin/bash warn=30 readarray -t users < <(awk -F: '{if ($3 >= 1000) { print $1 } }' /etc/passwd) current_date=$(date "+%s") for user in "

我在从下面的脚本显示数组时遇到问题(它显示距离密码过期还有多少天):

第一行是空的,有些是重复的。 这是数组问题,如简单cmd:

echo $USER $DAYS

显示正确的值。

问题是您尚未定义任何数组

#!/bin/bash
warn=30
readarray -t users < <(awk -F: '{if ($3 >= 1000) { print $1 } }' /etc/passwd)
current_date=$(date "+%s")
for user in "${users[@]}"
do
    get_exp_date=$(/usr/sbin/lchage -l "$user" | grep 'Password Expires' | cut -d: -f2)
    if [[ ${get_exp_date} == *"Never"* ]]
    then
      get_exp_date=01/01/2000
    fi
    pw_exp_date=$(date -d "$get_exp_date" "+%s")
    date_diff=$(($pw_exp_date - $current_date))
    days=$(($date_diff / (60*60*24)))

    # Do not send notification to legacy/non-expiring accounts - 365 days
    # and more from pw change
    if (($days <= $warn && $days >= -365))
    then
      user_array+=( "$user" )
      days_array+=( "$days" )
    fi
done

for ((i=0; i < ${#user_array[@]}; i++)); do
  echo "${user_array[i]} has ${days_array[i]} days to password expiry"
done
#/bin/bash
警告=30

readarray-t用户<问题是您尚未定义任何数组

#!/bin/bash
warn=30
readarray -t users < <(awk -F: '{if ($3 >= 1000) { print $1 } }' /etc/passwd)
current_date=$(date "+%s")
for user in "${users[@]}"
do
    get_exp_date=$(/usr/sbin/lchage -l "$user" | grep 'Password Expires' | cut -d: -f2)
    if [[ ${get_exp_date} == *"Never"* ]]
    then
      get_exp_date=01/01/2000
    fi
    pw_exp_date=$(date -d "$get_exp_date" "+%s")
    date_diff=$(($pw_exp_date - $current_date))
    days=$(($date_diff / (60*60*24)))

    # Do not send notification to legacy/non-expiring accounts - 365 days
    # and more from pw change
    if (($days <= $warn && $days >= -365))
    then
      user_array+=( "$user" )
      days_array+=( "$days" )
    fi
done

for ((i=0; i < ${#user_array[@]}; i++)); do
  echo "${user_array[i]} has ${days_array[i]} days to password expiry"
done
#/bin/bash
警告=30

readarray-t用户<您是否已决定使用数组?只要在你找到结果时回显一下就行了

#!/bin/bash
WARN=30
USERS=$(awk -F: '{if ($3 >= 1000) { print $1 } }' /etc/passwd)
DATE=$(date "+%s")
for USER in $USERS
do
    GET_EXP_DATE=$(/usr/sbin/lchage -l $USER | grep 'Password Expires' | cut -d: -f2)
    if [[ ${GET_EXP_DATE} == *"Never"* ]]
    then
            GET_EXP_DATE=01/01/2000
    fi
    PW_EXP_DATE=$(date -d "$GET_EXP_DATE" "+%s")
    DIFF=$(($PW_EXP_DATE-$DATE))
    let DAYS=$(($DIFF/(60*60*24)))

    # Do not send notification to legacy/non-expiring accounts - 365 days
    # and more from pw change
    if (($DAYS<=$WARN && $DAYS>=-365))
    then
        echo "$USER has $DAYS days to password expiry"
        #your mail code here
    fi
done
#/bin/bash
警告=30
USERS=$(awk-F:'{if($3>=1000){print$1}}'/etc/passwd)
日期=$(日期“+%s”)
适用于$USERS中的用户
做
GET_EXP_DATE=$(/usr/sbin/lchage-l$USER | grep'Password Expires'| cut-d:-f2)
如果[${GET\u EXP\u DATE}=*“Never”*]]
然后
获取日期=2000年1月1日
fi
PW_EXP_DATE=$(日期-d“$GET_EXP_DATE”“+%s”)
差异=$($PW\U EXP\U DATE-$DATE))
let DAYS=$($DIFF/(60*60*24)))
#不向旧版/未到期帐户发送通知-365天
#还有更多来自pw的改变
如果($DAYS=-365))
然后
echo“$USER距离密码到期还有$DAYS”
#你的邮政编码在这里
fi
完成

您是否已结婚使用阵列?只要在你找到结果时回显一下就行了

#!/bin/bash
WARN=30
USERS=$(awk -F: '{if ($3 >= 1000) { print $1 } }' /etc/passwd)
DATE=$(date "+%s")
for USER in $USERS
do
    GET_EXP_DATE=$(/usr/sbin/lchage -l $USER | grep 'Password Expires' | cut -d: -f2)
    if [[ ${GET_EXP_DATE} == *"Never"* ]]
    then
            GET_EXP_DATE=01/01/2000
    fi
    PW_EXP_DATE=$(date -d "$GET_EXP_DATE" "+%s")
    DIFF=$(($PW_EXP_DATE-$DATE))
    let DAYS=$(($DIFF/(60*60*24)))

    # Do not send notification to legacy/non-expiring accounts - 365 days
    # and more from pw change
    if (($DAYS<=$WARN && $DAYS>=-365))
    then
        echo "$USER has $DAYS days to password expiry"
        #your mail code here
    fi
done
#/bin/bash
警告=30
USERS=$(awk-F:'{if($3>=1000){print$1}}'/etc/passwd)
日期=$(日期“+%s”)
适用于$USERS中的用户
做
GET_EXP_DATE=$(/usr/sbin/lchage-l$USER | grep'Password Expires'| cut-d:-f2)
如果[${GET\u EXP\u DATE}=*“Never”*]]
然后
获取日期=2000年1月1日
fi
PW_EXP_DATE=$(日期-d“$GET_EXP_DATE”“+%s”)
差异=$($PW\U EXP\U DATE-$DATE))
let DAYS=$($DIFF/(60*60*24)))
#不向旧版/未到期帐户发送通知-365天
#还有更多来自pw的改变
如果($DAYS=-365))
然后
echo“$USER距离密码到期还有$DAYS”
#你的邮政编码在这里
fi
完成

带空格的字符串不是数组。作为一个良好的实践,避免使用所有CAP变量名:它们用于对操作系统有意义的环境变量;将它们用于您自己的变量也意味着您可能会错误地覆盖系统变量(实际上,您正在从代码中覆盖系统定义的变量
USER
)。请参阅指南/惯例。谢谢提醒!带空格的字符串不是数组。作为一个良好的实践,避免使用所有CAP变量名:它们用于对操作系统有意义的环境变量;将它们用于您自己的变量也意味着您可能会错误地覆盖系统变量(实际上,您正在从代码中覆盖系统定义的变量
USER
)。请参阅指南/惯例。谢谢提醒
user\u array+=(“$user”)
会更安全一些——有些平台,比如cygwin,可以有带空格的用户名。类似于
-l$user
-l“$user”
,&c。嗨,切普纳,谢谢你的回答!不幸的是,当我运行你的脚本时,我没有得到(空的)结果-可能是(更改的)日期计算有问题。我试着用你的和来修复我的脚本,我得到了正确的输出,但是格式正确(都粘在一行中):/检查是否通过?是否过期?新的sh和JACAPOLERUBTHOPFOWLEPGOLOMRRAJANOSTEELLUHARTJALANDDFARRETWHINTAKHAROKIAMITRANARKALECADMA有-256-256-256-2560-1651070-256-238-256-133-349-22501-364-351-176-347-179-289天的密码expiry@h3938116,您正在运行哪个版本的bash?如果原始代码不起作用,我想知道您是否没有在4.0中添加的
readarray
。在任何情况下,使用
bash-x脚本2>&1 | tee日志文件运行chepner脚本时,是否可以将其输出发布到?请随意添加您自己的脚本的
set-x
输出,作为同一要点中的一个单独文件,但如果需要,请包括其源代码(同样,作为一个单独的文件)。顺便说一句,在数组中添加第一个条目而不是添加一个新条目是由于省略了括号。我修复了第二个循环中的一个小错误,从
users\u-array
更改为
users\u-array
。它可以工作!!!顺便说一句,上一个user\u数组调用中缺少“}”(应该是:${user\u数组[i]})。谢谢大家
user\u array+=(“$user”)
会更安全一些——有些平台,比如cygwin,可以有带空格的用户名。类似于
-l$user
-l“$user”
,&c。嗨,切普纳,谢谢你的回答!不幸的是,当我运行你的脚本时,我没有得到(空的)结果-可能是(更改的)日期计算有问题。我试着用你的和来修复我的脚本,我得到了正确的输出,但是格式正确(都粘在一行中):/检查是否通过?是否过期?新的sh和JACAPOLERUBTHOPFOWLEPGOLOMRRAJANOSTEELLUHARTJALANDDFARRETWHINTAKHAROKIAMITRANARKALECADMA有-256-256-256-2560-1651070-256-238-256-133-349-22501-364-351-176-347-179-289天的密码expiry@h3938116,您正在运行哪个版本的bash?如果原始代码不起作用,我想知道您是否没有在4.0中添加的
readarray
。在任何情况下,使用
bash-x脚本2>&1 | tee日志文件运行chepner脚本时,是否可以将其输出发布到?请随意添加您自己的脚本的
set-x
输出,作为同一要点中的一个单独文件,但如果需要,请包括其源代码(同样,作为一个单独的文件)。顺便说一句,在数组中添加第一个条目而不是添加一个新条目是由于省略了括号。我修复了第二个循环中的一个小错误,从
users\u-array
更改为
users\u-array
。它可以工作!!!顺便说一句,上一个user\u数组调用中缺少“}”(应该是:${user\u数组[i]})。谢谢大家!!!:)谢谢我之所以使用数组,是因为我想发送输出,但不想将其放入