我正在编写一个脚本,我想在数字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
答案 0 :(得分:4)
要循环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
在bash中,默认情况下,以0
开头的数字是八进制。由于08
和09
非法作为基数为8的数字,因此会导致错误。为避免这种情况,请明确指定基数:
$ i=09; echo $(( 10#$i + 1 ))
10
表达式10#$i
告诉bash将$i
解释为基数为10的数字。
NOT 使用脚本变量的全部大写字母。系统使用全部大写,您不希望意外覆盖系统变量。
对于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
分配给不存在的目录会导致错误。
因此,再次,不会为您的脚本变量全部上限。
答案 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