我是一个上了年纪的守旧的程序员。现在也开始依赖 AI 工具,主要是翻译、做图、查一些代码语法和示例。但我从未尝试直接用 AI 写代码,或许这是在自己专业领域被挑战的防御心理,一种莫名的排斥。不过今晚破例了,因为我要写一个 shell 代码,而我不熟练,所以抱着试试看的心态,用自然语言向 AI 提了需求。我的提问内容是:
用shell 代码实现下列功能:
接收一个输入值作为用户名,记为 name。
生成一个 10000 到 65535 之间的随机数作为端口号,记为 port,如果当前目录下有子目录名末尾含这个 port,则重新生成一次。
最终的目录名为 www_slim_web_ + name + _ + port。
创建这个目录,进入这个目录并创建一个 docker-compose.yml,模版为:
version: '2.4'
services:
web:
image: dujunio/www-slim-web
volumes:
- wwwroot:/wwwroot
- db:/var/lib/mysql
environment:
- BURNTIME=1720232352
ports:
- "1611:80"
tty: true
container_name: www-slim-web
volumes:
wwwroot:
db:
将其中的 1611 替换为 port,container_name 替换为目录名。
最后执行 docker-compose up -d
AI 给出的回答是:
#!/bin/bash
# 读取输入值作为用户名
read -p "请输入用户名: " name
# 生成一个10000到65535之间的随机数作为端口号
port=$((RANDOM % 55536 + 10000))
# 检查当前目录下是否有子目录名末尾含这个端口号
while true; do
# 获取当前目录下的所有子目录名
directories=$(ls -d www_slim_web_* 2>/dev/null)
# 检查每个子目录名是否以端口号结尾
for dir in $directories; do
# 获取目录名中的端口号部分
dir_port=${dir##*_}
# 检查目录名中的端口号是否与生成的端口号相同
if [[ $dir_port == $port ]]; then
# 如果相同,则重新生成端口号
port=$((RANDOM % 55536 + 10000))
break
fi
done
# 如果没有找到以端口号结尾的子目录名,则退出循环
if [[ ! $directories =~ $port ]]; then
break
fi
done
# 创建目录
mkdir "www_slim_web_${name}_${port}"
# 进入新创建的目录
cd "www_slim_web_${name}_${port}"
# 创建 docker-compose.yml 文件
cat > docker-compose.yml << EOF
version: '2.4'
services:
web:
image: dujunio/www-slim-web
volumes:
- wwwroot:/wwwroot
- db:/var/lib/mysql
environment:
- BURNTIME=1720232352
ports:
- "${port}:80"
tty: true
container_name: www_slim_web_${name}_${port}
volumes:
wwwroot:
db:
EOF
# 执行 docker-compose up -d
docker-compose up -d
# 输出最终的目录名和端口号
echo "创建的目录为: www_slim_web_${name}_${port}"
echo "使用的端口号为: ${port}"
上述功能看似简单,其实涉及很多个语法,我自己写需要具体调试很多个片段。AI 写的代码我验证了是正确的。我的脑袋空白了几息,最后闪过的是《猩球崛起2》结尾凯撒的那句话。
The war has already began.
注:文中所用工具为海螺AI网页版 https://hailuoai.com
杜郎俊赏,算而今、重到须惊。纵豆蔻词工,青楼梦好,难赋深情。