私の英語が不都合なので、多くの説明ができません。私がしたいことの例は次のとおりです。
ここに例があります。
try.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.
bashではなくシェルスクリプトが必要です。
ベストアンサー1
あなたのスクリプトは、#!/bin/sh
shebang行を使用していることを示しています。問題になる理由は次のとおりです。一部のデフォルトシェルは配列をサポートしていません。。dash
Ubuntuはその例です。配列を使用できないデフォルトのシェルを必ず使用する必要がある場合は、リンクの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
一方、より多くの機能を備えたシェルを使用できる場合(多くの場合、オペレーティングシステムに複数のシェルがある場合)、アレイを使用してポートを保存することをお勧めします。配列が利用可能なときに(bash
、ksh
、mksh
、 shells )zsh
取る一般的なアプローチは次のとおりです。
printf "Enter ports(space separated):"
read ports
arr=( $ports )
80 22 23
たとえば、スペースに分割(しばしば単語分割とも呼ばれます)し、これらの個々の値を配列に供給するなどの文字列を使用しますarr
。これは理想的ではありませんが、機能します。
read -a
Bashにアクセスできる場合は、すべての項目を配列に読み込み、値を繰り返すという利点を享受できます。たとえば、
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
解決策を提供しませんが、一般的なアイデアは似ています