自动检测当前系统和Node.js版本,安装或更新到满足Node.js安装要求的编译器版本然后继续编译安装 #!/bin/bash # 检查是否为root用户 if [ "$EUID" -ne 0 ]; then echo "请以root用户运行此脚本" exit fi # 检查当前操作系统版本 OS_VERSION=$(lsb_release -rs) echo "检测到的Ubuntu版本: $OS_VERSION" # 检查是否已安装 Node.js if command -v node &> /dev/null; then INSTALLED_NODE_VERSION=$(node -v) echo "已安装的Node.js版本: $INSTALLED_NODE_VERSION" read -p "是否要卸载并重装Node.js? (y/N): " REINSTALL REINSTALL=${REINSTALL:-N} if [[ "$REINSTALL" =~ ^([yY][eE][sS]|[yY])$ ]]; then echo "正在卸载Node.js..." sudo apt-get purge -y nodejs npm sudo apt-get autoremove -y sudo rm -rf /usr/local/bin/node /usr/local/include/node /usr/local/lib/node_modules /usr/local/src/node* sudo rm -rf /usr/lib/node_modules /usr/bin/node /usr/bin/npm /usr/local/bin/npm else echo "退出脚本。" exit 0 fi fi # 更新系统并安装必要的依赖 sudo apt-get update sudo apt-get install -y build-essential python3 curl jq software-properties-common # 检查是否安装了 wget,如果没有则安装 if ! command -v wget &> /dev/null; then sudo apt-get install -y wget fi # 处理可能存在的前端锁文件 LOCK_FILES=("/var/lib/dpkg/lock-frontend" "/var/lib/apt/lists/lock") for LOCK_FILE in "${LOCK_FILES[@]}"; do if sudo fuser $LOCK_FILE >/dev/null 2>&1; then echo "检测到锁文件 $LOCK_FILE,正在删除..." sudo rm -f $LOCK_FILE fi done # 获取当前gcc版本 current_gcc_version=$(gcc -dumpversion) # 获取需要的Node.js版本 AVAILABLE_VERSIONS=$(curl -s https://nodejs.org/dist/index.json | jq -r '.[].version' | grep -E '^v(1[2-9]|[2-9][0-9])' | sort -V) echo "可用的 Node.js 版本:" echo "$AVAILABLE_VERSIONS" # 检测最优版本(最新LTS版本) RECOMMENDED_VERSION=$(curl -s https://nodejs.org/dist/index.json | jq -r '[.[] | select(.lts != false)] | .[0].version') # 如果推荐版本为空,则默认取最新版本 if [[ -z "$RECOMMENDED_VERSION" ]]; then RECOMMENDED_VERSION=$(echo "$AVAILABLE_VERSIONS" | tail -n 1) fi echo "推荐安装的版本: $RECOMMENDED_VERSION" # 提供选择菜单 read -p "请输入要安装的 Node.js 版本号 (默认: $RECOMMENDED_VERSION): " NODE_VERSION NODE_VERSION=${NODE_VERSION:-$RECOMMENDED_VERSION} # 检查用户输入是否为空 if [[ -z "$NODE_VERSION" ]]; then echo "版本号不能为空。退出脚本。" exit 1 fi echo "将安装Node.js版本: $NODE_VERSION" # 检查所需的gcc版本 REQUIRED_GCC_VERSION=$(curl -s https://nodejs.org/dist/$NODE_VERSION/SHASUMS256.txt | grep 'gcc' | head -n 1 | awk '{print $3}') if [[ -z "$REQUIRED_GCC_VERSION" ]]; then REQUIRED_GCC_VERSION=10 fi echo "当前gcc版本: $current_gcc_version, 需要的gcc版本: $REQUIRED_GCC_VERSION" if dpkg --compare-versions "$current_gcc_version" "lt" "$REQUIRED_GCC_VERSION"; then echo "正在安装所需的gcc版本..." sudo add-apt-repository -y ppa:ubuntu-toolchain-r/test sudo apt-get update sudo apt-get install -y gcc-$REQUIRED_GCC_VERSION g++-$REQUIRED_GCC_VERSION sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-$REQUIRED_GCC_VERSION 60 --slave /usr/bin/g++ g++ /usr/bin/g++-$REQUIRED_GCC_VERSION sudo update-alternatives --config gcc fi # 下载 Node.js 源代码 cd /usr/local/src sudo wget https://nodejs.org/dist/$NODE_VERSION/node-$NODE_VERSION.tar.gz # 检查下载是否成功 if [[ $? -ne 0 ]]; then echo "下载失败,请检查版本号是否正确。" exit 1 fi # 解压源代码 sudo tar -xzf node-$NODE_VERSION.tar.gz cd node-$NODE_VERSION # 配置、编译和安装 Node.js sudo ./configure sudo make -j$(nproc) sudo make install # 检查安装的 Node.js 版本 node_version=$(node -v) echo "Node.js 安装完成,版本号: $node_version" # 检查安装的 npm 版本 npm_version=$(npm -v) echo "npm 安装完成,版本号: $npm_version" 使用方法: 创建脚本文件 sudo nano install_node.sh 赋予执行权限 chmod +x install_node.sh 执行脚本文件 sudo ./install_node.sh