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

问题描述 投票:-2回答:4

我正在编写一个脚本,我想在数字1到15之间进行迭代,但希望它显示为01 02 03 ... 13 14 15.基本上我要做的是使用newusers命令添加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:非法数字: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
linux bash shell centos7
4个回答
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. 不要对脚本变量使用全部大写。系统使用全部大写,您不希望意外覆盖系统变量。 在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
投票

我不会尝试诊断您的错误消息,但您过度复杂化了您正在尝试实现的目标。

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

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,你就有了你的输出。


1
投票

由于尚未提及:

seq -w 1 15
seq -w 1 15 | while read num; do echo "n=$num"; done
© www.soinside.com 2019 - 2024. All rights reserved.