Linux - Bash - Get $releasever and $basearch values?

Learn linux - bash - get $releasever and $basearch values? with practical examples, diagrams, and best practices. Covers linux, bash, yum development techniques with visual explanations.

Dynamically Retrieving $releasever and $basearch in Linux Bash

Linux terminal showing bash commands and system information

Learn how to programmatically obtain the distribution release version ($releasever) and base architecture ($basearch) in Linux Bash scripts, crucial for building robust and portable system management tools.

When managing Linux systems, especially those using RPM-based distributions like CentOS, Fedora, or RHEL, you often encounter variables like $releasever and $basearch. These variables are fundamental for tasks such as configuring YUM/DNF repositories, installing architecture-specific packages, or tailoring scripts to different distribution versions. While YUM/DNF automatically resolves these, knowing how to retrieve them within a Bash script is essential for creating dynamic and adaptable automation.

Understanding $releasever and $basearch

Before diving into retrieval methods, let's clarify what these variables represent:

  • $releasever: This variable typically refers to the major release version of your operating system. For example, on CentOS 7, it would be 7; on Fedora 38, it would be 38. It's crucial for ensuring that your system pulls packages compatible with its specific distribution version.

  • $basearch: This variable represents the base architecture of your system. Common values include x86_64 for 64-bit Intel/AMD systems, aarch64 for 64-bit ARM systems, or ppc64le for PowerPC Little Endian. Using $basearch ensures that you download and install packages compiled for your system's specific hardware architecture.

flowchart TD
    A[Start Bash Script] --> B{Need $releasever or $basearch?}
    B -- Yes --> C[Identify Distribution (e.g., RHEL, Fedora)]
    C --> D{Method for $releasever?}
    D -- `rpm -E` --> E["Retrieve $releasever (e.g., `%{rhel}`)"]
    D -- `/etc/os-release` --> F["Retrieve $releasever (e.g., `VERSION_ID`)"]
    C --> G{Method for $basearch?}
    G -- `uname -i` --> H["Retrieve $basearch (e.g., `x86_64`)"]
    G -- `arch` --> I["Retrieve $basearch (e.g., `x86_64`)"]
    E --> J[Use in Script]
    F --> J
    H --> J
    I --> J
    J --> K[End Bash Script]

Decision flow for retrieving system variables in Bash

Retrieving $releasever

There are several reliable ways to get the $releasever value, depending on the distribution and the level of detail you need. The rpm -E command is often the most direct for RPM-based systems, as it mimics how YUM/DNF resolve these macros.

# Method 1: Using rpm -E (Recommended for RPM-based systems)
RELEASEVER_RPM=$(rpm -E %{rhel} || rpm -E %{fedora} || rpm -E %{centos} || rpm -E %{suse_version})
echo "Releasever (rpm -E): $RELEASEVER_RPM"

# Method 2: Using /etc/os-release (More generic, but might need parsing)
if [ -f /etc/os-release ]; then
    . /etc/os-release
    RELEASEVER_OS_RELEASE="$VERSION_ID"
    echo "Releasever (/etc/os-release): $RELEASEVER_OS_RELEASE"
fi

# Method 3: Using lsb_release (If available, less common on minimal installs)
if command -v lsb_release &> /dev/null; then
    RELEASEVER_LSB=$(lsb_release -rs)
    echo "Releasever (lsb_release): $RELEASEVER_LSB"
fi

Different methods to retrieve the $releasever value.

Retrieving $basearch

The $basearch value is generally easier to obtain as it directly relates to the system's CPU architecture. The uname -i or arch commands are the most common and reliable ways.

# Method 1: Using uname -i (Most common and reliable)
BASEARCH_UNAME=$(uname -i)
echo "Basearch (uname -i): $BASEARCH_UNAME"

# Method 2: Using arch command (Often a symbolic link to uname -m or similar)
BASEARCH_ARCH=$(arch)
echo "Basearch (arch): $BASEARCH_ARCH"

# Method 3: Using rpm --eval (If you want to mimic YUM/DNF's exact resolution)
BASEARCH_RPM=$(rpm --eval %{_arch})
echo "Basearch (rpm --eval): $BASEARCH_RPM"

Different methods to retrieve the $basearch value.

Practical Application: Dynamic Repository Configuration

Combining these techniques allows you to create highly flexible scripts. For instance, you can dynamically generate a YUM/DNF repository file that adapts to the host system's release and architecture.

#!/bin/bash

# Get releasever
RELEASEVER=$(rpm -E %{rhel} || rpm -E %{fedora} || rpm -E %{centos} || rpm -E %{suse_version})
if [ -z "$RELEASEVER" ]; then
    echo "Error: Could not determine releasever."
    exit 1
fi

# Get basearch
BASEARCH=$(uname -i)
if [ -z "$BASEARCH" ]; then
    echo "Error: Could not determine basearch."
    exit 1
fi

REPO_FILE="/etc/yum.repos.d/my-custom.repo"

cat <<EOF > "$REPO_FILE"
[my-custom-repo]
name=My Custom Repository for RHEL/CentOS $RELEASEVER - $BASEARCH
baseurl=http://example.com/repos/$RELEASEVER/$BASEARCH/
enabled=1
gpgcheck=0
EOF

echo "Generated repository file: $REPO_FILE"
cat "$REPO_FILE"

# Example of using the variables directly
echo "\nSystem is running $RELEASEVER on $BASEARCH architecture."

Bash script to dynamically create a YUM/DNF repository file.

This script first attempts to determine $releasever using rpm -E for various distributions. If that fails, you might add fallback logic using /etc/os-release. It then gets $basearch using uname -i. Finally, it uses these variables to construct a .repo file, ensuring that the baseurl points to the correct path for the specific system.