gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 05:36:50 25 4
gpt4 key购买 nike

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

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

基本上,当我使用参数运行脚本时,它应该看起来像这样=

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: Illegal 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

我的一个 friend 建议这样做,效果非常好。但我正试图在未来证明这件事。如果我要添加 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

最佳答案

  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 将失败。对脚本变量使用小写或混合大小写。

  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 分配给不存在的目录会导致错误。

    因此,不要将脚本变量全部大写。

关于linux - 脚本编写 - 使用 While 循环迭代数字(newusers 命令),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47897487/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com