如何保存两个变量的变化?

时间:2017-05-06 13:17:00

标签: linux shell

我需要编写一个bash脚本,用于检查新用户是否在5秒内登录,如果是,请打印它的详细信息:name,username,...... 我已经有以下代码,它会检查新用户是否已登录:

originalusers=$(users)
sleep 5
newusers=$(users)
if diff -u <(echo "$originalusers") <(echo "$newusers")
then
echo "Nothing's changed"
exit 1
else echo "New user is logged in"
diff -u <(echo "$originalusers") <(echo "$newusers") >shell

2 个答案:

答案 0 :(得分:0)

这是一个。它是一个使用awk计算出口和条目的bash脚本。

$ cat script.sh
#!/bin/bash
read -d '' awkscript <<EOF  # awk script is stored to a variable
BEGIN{
    split(now,n)
    split(then,t)
    for(i in n)
        a[n[i]]++
    for(j in t)
        a[t[j]]--
    for(i in a) 
        if(a[i]) 
            print i, (a[i]>0?"+":"") a[i] " sessions"
}
EOF
while true                  # loop forever
do
    sleep 1                 # edit wait time to your liking
    then="$now"
    now="$(users)"
    awk -v then="$then" -v now="$now" "$awkscript"
done

运行它:

$ bash script.sh
james 14 sessions  # initial amount of my xterms etc.
james +1 sessions  # opened one more xterm
james -1 sessions  # closed one xterm

真的没有任何地方可以测试它,有很多用户来来往往。

答案 1 :(得分:0)

如果我正确理解了这个问题,你想找到两个Bash变量之间的差异,并保持新变量的差异。一种可能性是将diff结果保存到变量中:

diff_result=`diff -u <(echo "$originalusers") <(echo "$newusers")`
echo -e "diff result:\n$diff_result"

但是,如果使用此代码,您仍然需要解析diff结果。另一种可能性是使用comm命令:

originalusers_lines=`sed -e 's/ /\n/g' <(echo "$originalusers") | sort -u`
newusers_lines=`sed -e 's/ /\n/g' <(echo "$newusers") | sort -u`
comm_result=`comm -13 <(echo "$originalusers_lines") <(echo "$newusers_lines")`
echo -e "new users:\n$comm_result"

前两行创建按行分隔的用户名的排序唯一列表。 comm命令用于查找仅出现在新用户名列表中的用户名。