我正在编写一个脚本,我想在数字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
$ for num in {01..15}; do echo "$num"; done
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
0
开头的数字是八进制。由于08
和09
作为基数为8的非法,它们将导致错误。为避免这种情况,请明确指定基数:
$ i=09; echo $(( 10#$i + 1 ))
10
表达式10#$i
告诉bash将$i
解释为基数为10的数字。UID
的情况下,它是一个只读的bash变量。您的脚本尝试分配UID
将失败。对脚本变量使用lower或mixed-case。$HOME
。请注意以下代码有效:
$ openssl rand -base64 12
1bh9+dp+Ap7xFIBB
但是以下失败了:
$ (HOME=/home/user; openssl rand -base64 12)
zceZeWsQGpohTPvv
unable to write 'random state'
显然,openssl
希望能够访问$HOME
。将HOME
分配给不存在的目录会导致错误。
所以,同样,不要为脚本变量全部上限。我不会尝试诊断您的错误消息,但您过度复杂化了您正在尝试实现的目标。
for i in {01..15}; do echo $i; done
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
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
,你就有了你的输出。
由于尚未提及:
seq -w 1 15
seq -w 1 15 | while read num; do echo "n=$num"; done