Tag Archive macOS

Byphunsanit

Shell script: ติดตั้งฟอนต์ใน macOS, Linux

PowerShell ที่ช่วยในการติดตั้ง ฟอนต์แห่งชาติ (13 ตัวดั้งเดิม + ปรับปรุง) หรือฟอนต์ อื่น ๆ ที่อยู่ในรายชื่อให้ windows โดยอัตโนมัติ หรือจะใส่ fonts ใน folder fonts ไว้ก็ได้ เพื่อติดตั้งในหลาย ๆ เครื่องได้ง่าย ๆโดยจะโหลดมาจาก Google Fonts
install_fonts_from_google_fonts.sh

#!/bin/bash

# ====================================================
# SYNOPSIS
#    Download and Install Google Fonts for macOS/Linux
#    - Auto-checks for Root (Sudo)
#    - Options: Cache to Local, Fixed Path, or No Cache
#    Author: pitt phunsanit (pitt.plusmagi.com)
# ====================================================

# --- COLORS ---
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
CYAN='\033[0;36m'
GRAY='\033[0;90m'
NC='\033[0m' # No Color

# --- 0. ROOT CHECK ---
if [ "$EUID" -ne 0 ]; then
  echo -e "${RED}Please run as root (use sudo).${NC}"
  echo "Usage: sudo ./install_fonts.sh"
  exit
fi

# --- 1. DETECT OS & SET INSTALL PATH ---
OS_TYPE=""
INSTALL_DIR=""

if [[ "$OSTYPE" == "darwin"* ]]; then
    OS_TYPE="macOS"
    INSTALL_DIR="/Library/Fonts"
else
    OS_TYPE="Linux"
    # Create a specific directory for these fonts to keep it clean
    INSTALL_DIR="/usr/share/fonts/google-thai-fonts"
fi

# --- 2. SETUP PATHS & MENU ---
SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
USB_FONTS_PATH="$SCRIPT_DIR/Fonts"
FIXED_FONTS_PATH="/opt/portables/Fonts" # Linux/Mac equivalent convention
CACHE_DIR=""
SHOULD_CLEANUP=false

clear
echo -e "${CYAN}====================================================${NC}"
echo -e "${CYAN}       GOOGLE FONTS INSTALLER UTILITY ($OS_TYPE)${NC}"
echo -e "${CYAN}       Author: pitt phunsanit (pitt.plusmagi.com)${NC}"
echo -e "${CYAN}====================================================${NC}"

echo -e "Select Download/Cache Destination:"
echo -e "[1] Current Location : ${YELLOW}$USB_FONTS_PATH${NC}"
echo -e "[2] Fixed Path       : ${GRAY}$FIXED_FONTS_PATH${NC}"
echo -e "[3] No Cache         : ${RED}(Temp & Delete)${NC}"

read -p "Select [1], [2] or [3] (Default is 1): " choice

# Logic to set directory
if [ "$choice" == "2" ]; then
    CACHE_DIR="$FIXED_FONTS_PATH"
elif [ "$choice" == "3" ]; then
    CACHE_DIR=$(mktemp -d)
    SHOULD_CLEANUP=true
else
    CACHE_DIR="$USB_FONTS_PATH"
fi

# --- 3. CONFIGURATION ---
FONTS=(
    "Bai+Jamjuree"
    "Chakra+Petch"
    "Charm"
    "Charmonman"
    "Fah+Kwang"
    "K2D"
    "Kodchasan"
    "KoHo"
    "Krub"
    "Maitree"
    "Mali"
    "Niramit"
    "Sarabun"
    "Srisakdi"
    "Taviraj"
    "Thasadith"
)

# --- 4. START PROCESS ---

# Create Directory
if [ ! -d "$CACHE_DIR" ]; then
    mkdir -p "$CACHE_DIR"
    echo -e "${CYAN}Created working folder at: $CACHE_DIR${NC}"
else
    echo -e "${CYAN}Using working folder at: $CACHE_DIR${NC}"
fi

# Check for unzip tool
if ! command -v unzip &> /dev/null; then
    echo -e "${RED}Error: 'unzip' is not installed. Please install it first.${NC}"
    exit 1
fi

echo ""
# Download & Extract Loop
for font in "${FONTS[@]}"; do
    url="https://fonts.google.com/download?family=$font"
    zip_path="$CACHE_DIR/$font.zip"
    
    # Check Cache
    if [ -f "$zip_path" ]; then
        echo -e "${GRAY}[$font] Found in cache. Skipping download.${NC}"
    else
        echo -e "${YELLOW}[$font] Downloading...${NC}"
        # curl -L (follow redirects) -o (output file) -s (silent) -w (write status)
        if curl -L -o "$zip_path" "$url" --fail --silent; then
            echo -e "${GREEN}[$font] Download completed.${NC}"
        else
            echo -e "${RED}[$font] Error downloading.${NC}"
            continue
        fi
    fi

    # Extract
    # -o (overwrite) -d (destination) -j (junk paths/flatten folders if any)
    unzip -o -j -q "$zip_path" -d "$CACHE_DIR" "*.ttf" "*.otf" 2>/dev/null
done

# --- 5. INSTALLATION ---
echo -e "\n${CYAN}Starting Installation to: $INSTALL_DIR${NC}"

# Create install dir if needed (mainly for Linux custom folder)
if [ ! -d "$INSTALL_DIR" ]; then
    mkdir -p "$INSTALL_DIR"
fi

# Copy Fonts
count=0
# Find .ttf and .otf files in Cache Dir
for file in "$CACHE_DIR"/*.{ttf,otf}; do
    [ -e "$file" ] || continue # Handle case if no fonts found
    
    filename=$(basename "$file")
    
    # Check if exists in System
    if [ -f "$INSTALL_DIR/$filename" ]; then
        echo -e "${GRAY}Skipping $filename (Already installed)${NC}"
    else
        echo -e "${YELLOW}Installing $filename ...${NC}"
        cp "$file" "$INSTALL_DIR/"
        chmod 644 "$INSTALL_DIR/$filename" # Ensure readable
        ((count++))
    fi
done

# --- 6. OS SPECIFIC CACHE UPDATE ---
if [ "$OS_TYPE" == "Linux" ]; then
    if [ $count -gt 0 ]; then
        echo -e "${YELLOW}Updating Linux font cache...${NC}"
        fc-cache -f -v "$INSTALL_DIR" > /dev/null
    fi
fi

# --- FINISH ---
echo -e "\n${GREEN}------------------------------------------------${NC}"

if [ "$SHOULD_CLEANUP" = true ]; then
    echo -e "${RED} Cleaning up temporary files...${NC}"
    rm -rf "$CACHE_DIR"
    echo -e "${GREEN} Temp folder deleted.${NC}"
else
    echo -e "${CYAN} Fonts stored at: $CACHE_DIR${NC}"
fi

echo -e "${GREEN} Process Completed!${NC}"
echo -e "${GREEN}------------------------------------------------${NC}"

# Add a pause similar to the PowerShell script
sleep 2
  1. สร้างไฟล์ install_fonts_from_google_fonts.sh โดยใช้
    touch install_fonts_from_google_fonts.sh
    บน Desktop หรือจะใส่ใน USB เลยก็ได้
  2. ใส่เนื้อหาตามที่เห็นด้านบน
  3. ถ้าต้องการเปลี่ยน fonts ก็ให้เปลี่ยนแปลงใน $fontList
  4. บันทึกไฟล์

การใช้งาน

  1. ไปที่เมนูของ windows ช่องค้นหา พิมพ์ powershell
  2. พิมพ์ cd ตามด้วย folder ที่ save install_fonts_from_google_fonts.sh เช่น
    /Volumes/Untitled/Fonts
  3. set permission
    sudo chmod +x install_fonts_from_google_fonts.sh
  4. ใช้โดยพิมพ์
    sudo ./install_fonts_from_google_fonts.sh
  5. ทำตามขั้นตอนไปเรื่อย ๆ

อ่านเพิ่มเติม