我无法给出太多解释,因为我的英语很糟糕。我想做的例子如下;
这是一个例子。
尝试.sh
#!/bin/sh
echo -n "Enter the port:"
read ports
if [ ! -d "$ports" ]; then
mkdir -p /root/port$ports
echo "The folder was created for $ports"
wget -q www.example.com/example.tar.bz2
tar -xjf example.tar.bz2
su root -c "screen -A -m -d -S 'example$ports' ./example -RunningAsRootIsEvilAndIKnowThat"
echo "$ports started."
else
exit 0
fi
油灰;
root@ubuntu:~# sh try.sh
Enter the port: 4445, 4546
Created folder 'port4445'
Created folder 'port4546'
4445 started.
4546 started.
我需要 shell 脚本,而不是 bash。
答案1
您的脚本显示您正在#!/bin/sh
shebang 行中使用。这可能是一个问题,因为一些默认 shell 不支持数组。。dash
Ubuntu就是一个例子。如果您绝对必须使用不能使用数组的默认 shell,请参阅链接中 Stephane 的答案。或者,可以像这样利用分词:
read -p "Enter ports(space separated):" ports
for port in $ports
do
[ -d "/root/port$port" ] || mkdir -p "/root/port$port" && echo "Created /root/port$port"
done
另一方面,如果我们可以使用具有更多功能的 shell(并且在许多情况下操作系统有多个 shell),那么最好使用数组来存储端口。当数组可用(bash
, ksh
, mksh
, zsh
shells )时我会采取的一般方法如下:
printf "Enter ports(space separated):"
read ports
arr=( $ports )
在这里,我们利用 string 的优势,例如,80 22 23
按空格分割(通常称为单词分割)并将这些单独的值提供给 array arr
。这远非理想,但有效。
如果您可以使用 bash,则可以利用将read -a
所有项目读取为数组,然后迭代这些值。例如:
bash-4.3$ read -p "Enter ports(space separated):" -a portsEnter ports(space separated):80 22 25
bash-4.3$ echo ${ports[0]}
80
bash-4.3$ echo ${ports[1]}
22
bash-4.3$ echo ${ports[2]}
25
同样的方法也可以用在ksh
with上read -A
。
然后你可以做这样的事情:
for port in ${ports[@]};
do
[ -d "/root/port$port" ] || mkdir -p "/root/port$port" && echo "Created /root/port$port"
done
我不熟悉,csh
所以不会提供解决方案,但总体思路应该类似