You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从PHP配置子脚本返回start.sh主菜单且不重启主脚本?

解决方案

我会分两部分解决你的问题:让子菜单执行完自动返回主菜单,以及将配置参数持久化到全局可读取的文件中。

1. 让主菜单循环显示,无需重启脚本

原来的start.sh执行完菜单选项后就直接退出了,我们可以把菜单逻辑放到一个while true循环里,这样每次执行完子菜单操作后,会回到循环开头重新显示主菜单。

修改后的start.sh代码:

#!/bin/bash
# 加载全局配置文件(如果存在)
CONFIG_FILE="/etc/php_custom_config.conf"
[ -f "$CONFIG_FILE" ] && source "$CONFIG_FILE"

# 确保dialog已安装
apt-get -qq install dialog >/dev/null 2>&1

# 主菜单循环
while true; do
    HEIGHT=30 WIDTH=60 CHOICE_HEIGHT=14
    BACKTITLE="Server Management Menu"
    TITLE="Main Menu"
    MENU="Choose one of the following options:"
    OPTIONS=(1 "Make 1" 2 "PHP 7.x Configuration" 3 "Make 3" 4 "Exit") # 新增退出选项

    CHOICE=$(dialog --clear \
     --nocancel \
     --backtitle "$BACKTITLE" \
     --title "$TITLE" \
     --menu "$MENU" \
     $HEIGHT $WIDTH $CHOICE_HEIGHT \
     "${OPTIONS[@]}" \
     2>&1 >/dev/tty)
    clear

    case $CHOICE in
    1) # Make 1
        echo "Executing Make 1..."
        # 这里替换为你的Make1实际逻辑
        sleep 2 # 示例延迟,可删除
        ;;
    2) # PHP 7.x配置
        # 加载子脚本并调用配置函数
        source "${SCRIPT_PATH}/menu_php_7_x.sh"
        php_7_x_config
        ;;
    3) # Make 3
        echo "Executing Make 3..."
        # 这里替换为你的Make3实际逻辑
        sleep 2 # 示例延迟,可删除
        ;;
    4) # 退出脚本
        echo "Exiting..."
        exit 0
        ;;
    esac
done

2. 持久化配置参数到全局文件

我们创建一个全局配置文件(比如/etc/php_custom_config.conf),每次修改PHP参数时,不仅更新php.ini,还把参数写入这个文件,这样所有需要读取的脚本只要source这个文件就能获取最新值。

修改后的menu_php_7_x.sh代码:

#!/bin/bash
# 定义全局配置文件路径
CONFIG_FILE="/etc/php_custom_config.conf"
# 确保配置文件存在
touch "$CONFIG_FILE"

# 自动获取当前PHP的配置文件路径(适配大部分PHP7.x版本)
PHP_INI_PATH=$(php -i | grep "Loaded Configuration File" | awk '{print $NF}')

php_7_x_config() {
    while true; do
        HEIGHT=30 WIDTH=60 CHOICE_HEIGHT=6
        BACKTITLE="PHP Configuration"
        TITLE="PHP.ini Settings Menu"
        MENU="Choose one of the following options:"
        OPTIONS=(1 "Change post_max_size" 2 "Change upload_max_filesize" 3 "Change memory_limit" 4 "Back to Main Menu")

        CHOICE=$(dialog --clear \
         --nocancel \
         --backtitle "$BACKTITLE" \
         --title "$TITLE" \
         --menu "$MENU" \
         $HEIGHT $WIDTH $CHOICE_HEIGHT \
         "${OPTIONS[@]}" \
         2>&1 >/dev/tty)
        clear

        case $CHOICE in
        1)
            # 获取当前值作为输入框默认值
            current_val=$(grep -E '^post_max_size' "$PHP_INI_PATH" | awk -F= '{print $2}' | xargs)
            # 弹出输入框获取用户输入
            post_max_size=$(dialog --clear \
             --backtitle "$BACKTITLE" \
             --inputbox "Please enter post_max_size value (e.g. 20M):" \
             $HEIGHT $WIDTH "$current_val" \
             3>&1 1>&2 2>&3 3>&- \
             )
            # 更新php.ini配置
            sed -i "s/^post_max_size.*/post_max_size = $post_max_size/" "$PHP_INI_PATH"
            # 更新全局配置文件(先删除旧条目再新增)
            sed -i "/^export POST_MAX_SIZE/d" "$CONFIG_FILE"
            echo "export POST_MAX_SIZE=\"$post_max_size\"" >> "$CONFIG_FILE"
            # 重新加载配置到当前会话
            source "$CONFIG_FILE"
            # 提示用户修改完成
            dialog --msgbox "post_max_size updated to $post_max_size" 10 40
            ;;
        2)
            current_val=$(grep -E '^upload_max_filesize' "$PHP_INI_PATH" | awk -F= '{print $2}' | xargs)
            upload_max_filesize=$(dialog --clear \
             --backtitle "$BACKTITLE" \
             --inputbox "Please enter upload_max_filesize value (e.g. 20M):" \
             $HEIGHT $WIDTH "$current_val" \
             3>&1 1>&2 2>&3 3>&- \
             )
            sed -i "s/^upload_max_filesize.*/upload_max_filesize = $upload_max_filesize/" "$PHP_INI_PATH"
            sed -i "/^export UPLOAD_MAX_FILESIZE/d" "$CONFIG_FILE"
            echo "export UPLOAD_MAX_FILESIZE=\"$upload_max_filesize\"" >> "$CONFIG_FILE"
            source "$CONFIG_FILE"
            dialog --msgbox "upload_max_filesize updated to $upload_max_filesize" 10 40
            ;;
        3)
            current_val=$(grep -E '^memory_limit' "$PHP_INI_PATH" | awk -F= '{print $2}' | xargs)
            memory_limit=$(dialog --clear \
             --backtitle "$BACKTITLE" \
             --inputbox "Please enter memory_limit value (e.g. 256M):" \
             $HEIGHT $WIDTH "$current_val" \
             3>&1 1>&2 2>&3 3>&- \
             )
            sed -i "s/^memory_limit.*/memory_limit = $memory_limit/" "$PHP_INI_PATH"
            sed -i "/^export MEMORY_LIMIT/d" "$CONFIG_FILE"
            echo "export MEMORY_LIMIT=\"$memory_limit\"" >> "$CONFIG_FILE"
            source "$CONFIG_FILE"
            dialog --msgbox "memory_limit updated to $memory_limit" 10 40
            ;;
        4) # 返回主菜单
            clear
            return 0
            ;;
        esac
    done
}

关键说明

  • 循环菜单设计:主脚本和子脚本都采用while true循环,子脚本选“Back to Main Menu”时用return退出子函数,回到主脚本的循环,自动重新显示主菜单。
  • 全局配置共享:用/etc/php_custom_config.conf存储变量,所有需要读取的脚本只需在开头添加source /etc/php_custom_config.conf即可获取最新配置值。
  • 实时更新php.ini:通过sed命令直接修改PHP配置文件,同时在输入框显示当前值,提升用户体验。
  • 权限注意:修改/etc目录下的文件和php.ini需要root权限,运行start.sh时请加上sudo。

内容的提问来源于stack exchange,提问作者Dr.JoeBeer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 08:51:49