脚本 - 使用While循环迭代数字(newusers命令)

时间:2017-12-20 01:15:52

标签: linux bash shell centos7

我正在编写一个脚本,我想在数字1到15之间进行迭代,但希望它显示为01 02 03 ... 13 14 15.基本上我要做的是使用新用户添加15个用户命令并将此脚本用作<对命令。新用户需要采用以下格式:

pw_name:pw_passwd:pw_uid:pw_gid:pw_gecos:pw_dir:pw_shell

基本上,当我使用arguments =

运行脚本时,它应该是这样的
cstuser01:EzVlK9Je8JvfQump:1001:1001:CST8177 user:/home/cstuser01:/bin/bash
cstuser02:EsKOfvhgnWpiBT6c:1002:1002:CST8177 user:/home/cstuser02:/bin/bash
cstuser03:qzQuR5vRgxdzY6dq:1003:1003:CST8177 user:/home/cstuser03:/bin/bash

我得到了大部分工作,但我收到以下错误:

  

./ 15users.sh:57:./15users.sh:Illlegal number:08

到目前为止,这是我的脚本(我拿出了几个错误检查部分)=

#!/bin/sh -u
PATH=/bin:/usr/bin ; export PATH
umask=022

#num=1 (this variable is needed depending on which loop I use below)
user=$prefix"user"
uid=1001
gid=$uid
home=/home/$user
shell=/bin/bash

#echo "pw_name:pw_passwd:pw_uid:pw_gid:pw_gecos:pw_dir:pw_shell"
#PASSWD=$(openssl rand -base64 12)

我最初有这个,但遇到了一些问题:

while [ $NUM -le 15 ] ; do
       if [ $NUM -lt 10 ] ; then
               NUM=0$NUM
       fi
       echo "$USER$NUM:$(openssl rand -base64 12):$UID:$GID:$GECO:$HOME$NUM:$SHELL"
       UID=$(( UID + 1 ))
       GID=$(( GID + 1 ))
       NUM=$(( NUM + 1 ))
done

我的一位朋友建议这样做,它完全没问题。但我正试图将来证明这件事。如果我要添加100或1,000个用户,该怎么办?

for NUM in 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 ; do
       echo "$USER$NUM:$(openssl rand -base64 12):$UID:$GID:$GECO:$HOME$NUM:$SHELL"
done

这不起作用:

for num in {01..15} ; do
    i=09
    echo "$(( 10#$num + 1 ))"
    10
done

然后我尝试了这个语法错误=

./ 15users.sh:50:./15users.sh:语法错误:循环变量错误

for (( num=1; num<=15; num++ )) ; do
    printf "%02d\n" $num
done

我也尝试了这个,但是seq垂直打印而不是水平打印:

#iterate=$(seq -w 1 15)
for $iterate ; do
       echo "$user$num:$(openssl rand -base64 12):$uid:$gid:$geco:$home$num:$shell"
done

4 个答案:

答案 0 :(得分:4)

  1. 要循环01到15,使用大括号扩展要简单得多:

    $ for num in {01..15}; do echo "$num"; done
    01
    02
    03
    04
    05
    06
    07
    08
    09
    10
    11
    12
    13
    14
    15
    
  2. 在bash中,默认情况下,以0开头的数字是八进制。由于0809非法作为基数为8的数字,因此会导致错误。为避免这种情况,请明确指定基数:

    $ i=09; echo $(( 10#$i + 1 ))
    10
    

    表达式10#$i告诉bash将$i解释为基数为10的数字。

  3. NOT 使用脚本变量的全部大写字母。系统使用全部大写,您不希望意外覆盖系统变量。

    对于UID,它是只读 bash变量。您的脚本尝试分配UID将失败。对脚本变量使用lower或mixed-case。

  4. 全部大写问题的另一个例子是$HOME。请注意以下代码有效:

    $ openssl rand -base64  12
    1bh9+dp+Ap7xFIBB
    

    但以下失败:

    $ (HOME=/home/user; openssl rand -base64  12)
    zceZeWsQGpohTPvv
    unable to write 'random state'
    

    显然,openssl期望对$HOME具有写入权限。 将HOME分配给不存在的目录会导致错误。

    因此,再次,不会为您的脚本变量全部上限。

答案 1 :(得分:1)

我不会尝试诊断您的错误消息,但是您过度复杂化了。

for i in {01..15}; do echo $i; done
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15

答案 2 :(得分:1)

Bash也支持C样式循环:

$ for (( i=1; i<=15; i++ )); do printf "%02d\n" $i; done
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15

只需使用带有标记的printf打印前导0即可获得输出。

答案 3 :(得分:1)

由于尚未提及:

seq -w 1 15
seq -w 1 15 | while read num; do echo "n=$num"; done