내 영어가 형편없어서 많은 설명을 할 수가 없어요. 내가 하고 싶은 일의 예는 다음과 같습니다.
여기에 예가 있습니다.
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
우분투가 그 예이다. 배열을 사용할 수 없는 기본 셸을 반드시 사용해야 하는 경우 링크에서 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
해결책을 제공하지는 않지만 일반적인 아이디어는 비슷할 것입니다