Saltar a contenido

Bash - Bourne Again Shell

# Check if Bash is installed
which bash
/bin/bash

# Check Bash version
bash --version
GNU bash, version 5.1.16(1)-release (x86_64-pc-linux-gnu)

# Check current shell
echo $SHELL
/bin/bash

# Check available shells
cat /etc/shells
```# Bash - Bourne Again Shell

<div class="cheat-sheet-actions">
  ```bash
# Set Bash as default shell for current user
chsh -s /bin/bash

# Set Bash as default shell for specific user (as root)
sudo chsh -s /bin/bash username

# Verify shell change
echo $SHELL
```bash

Ubuntu/Debian

sudo apt update && sudo apt install bash

CentOS/RHEL/Fedora

sudo dnf install bash

macOS (using Homebrew for latest version)

brew install bash

Arch Linux

sudo pacman -S bash

FreeBSD

pkg install bash Bash (Bourne Again Shell) es un intérprete de comandos Unix y un lenguaje de comandos escrito por Brian Fox para el Proyecto GNU como un reemplazo de software libre para el Bourne Shell. Lanzado por primera vez en 1989, Bash se ha convertido en el intérprete predeterminado en la mayoría de las distribuciones Linux y es uno de los intérpretes más utilizados en el ecosistema Unix/Linux. Combina las características del shell Bourne original con funcionalidades adicionales, incluyendo completado de comandos, historial de comandos y capacidades de scripting mejoradas.bash

Basic command structure

command [options] [arguments]

Examples

ls -la /home cp file1.txt file2.txt grep -r "pattern" /path/to/search ```## Instalación y Configuración

Verificando la Instalación de Bash

```bash

Variable assignment (no spaces around =)

name="John Doe" age=30 path="/home/user"

Using variables

echo $name echo $\\{name\\} echo "Hello, $name"

Environment variables

export PATH="/usr/local/bin:$PATH" export EDITOR="vim"

Special variables

echo $0 # Script name echo $1 # First argument echo $# # Number of arguments echo $@ # All arguments echo $ # Process ID echo $? # Exit status of last command ### Establecer Bash como Shell Predeterminadobash

Using $() (preferred)

current_date=\((date) file_count=\)(ls|wc -l) user_home=\((eval echo ~\)USER)

Using backticks (legacy)

current_date=date file_count=ls|wc -l

Nested command substitution

echo "Today is $(date +%A), $(date +%B) $(date +%d)" ### Instalación de Bash en Diferentes Sistemasbash

Single quotes (literal)

echo 'The variable $HOME is not expanded'

Double quotes (variable expansion)

echo "Your home directory is $HOME"

Escaping special characters

echo "The price is $10" echo "Use \"quotes\" inside quotes"

Here documents

cat << EOF This is a multi-line text block that can contain variables like $HOME EOF

Here strings

grep "pattern" <<< "$variable" ```## Sintaxis y Comandos Básicos de Bash

Estructura de Comandos

```bash

Change directory

cd /path/to/directory cd ~ # Home directory cd - # Previous directory cd .. # Parent directory cd ../.. # Two levels up

Print working directory

pwd

Directory stack operations

pushd /path/to/dir # Push directory onto stack popd # Pop directory from stack dirs # Show directory stack ### Variables y Entornobash

Basic listing

ls ls -l # Long format ls -la # Long format with hidden files ls -lh # Human readable sizes ls -lt # Sort by modification time ls -lS # Sort by size ls -lR # Recursive listing

Advanced listing options

ls -la --color=auto # Colored output ls -la --time-style=full-iso # ISO time format ls -la --group-directories-first # Directories first ### Sustitución de Comandosbash

Create files

touch file.txt touch file1.txt file2.txt file3.txt

Copy files and directories

cp source.txt destination.txt cp -r source_dir/ destination_dir/ cp -p file.txt backup.txt # Preserve attributes cp -u source.txt dest.txt # Update only if newer

Move and rename

mv old_name.txt new_name.txt mv file.txt /path/to/destination/ mv *.txt /path/to/directory/

Remove files and directories

rm file.txt rm -f file.txt # Force removal rm -r directory/ # Recursive removal rm -rf directory/ # Force recursive removal rm -i *.txt # Interactive removal

Create directories

mkdir directory_name mkdir -p path/to/nested/directory mkdir -m 755 directory_name # With specific permissions ### Comillas y Escapebash

Change permissions

chmod 755 file.txt chmod u+x script.sh # Add execute for user chmod g-w file.txt # Remove write for group chmod o=r file.txt # Set read-only for others chmod -R 644 directory/ # Recursive permission change

Change ownership

chown user:group file.txt chown -R user:group directory/ chgrp group file.txt # Change group only

View permissions

ls -l file.txt stat file.txt # Detailed file information ```## Operaciones de Archivos y Navegación

```bash

View file contents

cat file.txt # Display entire file less file.txt # Paginated view more file.txt # Simple paginated view head file.txt # First 10 lines head -n 20 file.txt # First 20 lines tail file.txt # Last 10 lines tail -n 20 file.txt # Last 20 lines tail -f file.txt # Follow file changes

File comparison

diff file1.txt file2.txt diff -u file1.txt file2.txt # Unified format cmp file1.txt file2.txt # Binary comparison ### Listado de Archivos y Directoriosbash

grep - pattern searching

grep "pattern" file.txt grep -i "pattern" file.txt # Case insensitive grep -r "pattern" directory/ # Recursive search grep -n "pattern" file.txt # Show line numbers grep -v "pattern" file.txt # Invert match grep -E "pattern1|pattern2" file.txt # Extended regex

Advanced grep options

grep -A 3 "pattern" file.txt # Show 3 lines after match grep -B 3 "pattern" file.txt # Show 3 lines before match grep -C 3 "pattern" file.txt # Show 3 lines around match grep -l "pattern" *.txt # Show only filenames grep -c "pattern" file.txt # Count matches ### Operaciones de Archivosbash

sed - stream editor

sed 's/old/new/' file.txt # Replace first occurrence sed 's/old/new/g' file.txt # Replace all occurrences sed '1,5s/old/new/g' file.txt # Replace in lines 1-5 sed '/pattern/d' file.txt # Delete lines matching pattern sed -n '1,10p' file.txt # Print lines 1-10

awk - pattern scanning and processing

awk '\\{print $1\\}' file.txt # Print first column awk '\\{print $NF\\}' file.txt # Print last column awk '/pattern/ \\{print $0\\}' file.txt # Print lines matching pattern awk -F: '\\{print $1\\}' /etc/passwd # Use : as field separator awk '\\{sum += $1\\} END \\{print sum\\}' file.txt # Sum first column

cut - extract columns

cut -d: -f1 /etc/passwd # Extract first field cut -c1-10 file.txt # Extract characters 1-10 cut -f2,4 file.txt # Extract fields 2 and 4

sort and uniq

sort file.txt # Sort lines sort -n file.txt # Numeric sort sort -r file.txt # Reverse sort sort -k2 file.txt # Sort by second field uniq file.txt # Remove duplicate lines sort file.txt|uniq -c # Count occurrences ### Permisos y Propiedad de Archivosbash

Output redirection

command > file.txt # Redirect stdout to file (overwrite) command >> file.txt # Redirect stdout to file (append) command 2> error.log # Redirect stderr to file command 2>> error.log # Redirect stderr to file (append) command &> output.log # Redirect both stdout and stderr command > output.log 2>&1 # Redirect both stdout and stderr

Input redirection

command < input.txt # Read input from file command << EOF # Here document line 1 line 2 EOF

Advanced redirection

command 3> file.txt # Redirect to file descriptor 3 exec 3> file.txt # Open file descriptor 3 echo "text" >&3 # Write to file descriptor 3 exec 3>&- # Close file descriptor 3 ```## Procesamiento y Manipulación de Texto

Operaciones de Contenido de Archivos

```bash

Basic pipes

ls -l|grep "txt" # List files and filter for .txt ps aux|grep "process_name" # Show processes and filter cat file.txt|sort|uniq # Sort and remove duplicates

Complex pipe chains

cat /var/log/access.log|grep "404"|awk '\\{print $1\\}'|sort|uniq -c|sort -nr find . -name "*.log"|xargs grep "ERROR"|cut -d: -f1|sort|uniq

Tee command (split output)

command|tee file.txt # Write to file and stdout command|tee -a file.txt # Append to file and stdout ### Búsqueda y Filtrado de Textobash

Background and foreground jobs

command & # Run command in background jobs # List active jobs fg %1 # Bring job 1 to foreground bg %1 # Send job 1 to background kill %1 # Kill job 1

Process control signals

Ctrl+C # Interrupt (SIGINT) Ctrl+Z # Suspend (SIGTSTP) Ctrl+ # Quit (SIGQUIT) ### Herramientas de Procesamiento de Textobash

Process listing

ps # Show current processes ps aux # Show all processes ps -ef # Full format listing pstree # Show process tree top # Real-time process monitor htop # Enhanced process monitor

Process management

kill PID # Terminate process kill -9 PID # Force kill process killall process_name # Kill all processes by name pkill pattern # Kill processes matching pattern nohup command & # Run command immune to hangups ```## Redirección de Entrada/Salida y Tuberías

Operadores de Redirección

```bash

!/bin/bash

Script description and metadata

Author: Your Name

Date: YYYY-MM-DD

Version: 1.0

Script content starts here

echo "Hello, World!" ### Variables y Tipos de Datosbash

String variables

name="John Doe" message='Hello, World!' multiline="This is a multi-line string"

Numeric variables

number=42 pi=3.14159

Arrays

fruits=("apple" "banana" "orange") numbers=(1 2 3 4 5)

Associative arrays (Bash 4+)

declare -A colors colors[red]="#FF0000" colors[green]="#00FF00" colors[blue]="#0000FF"

Array operations

echo $\\{fruits[0]\\} # First element echo $\\{fruits[@]\\} # All elements echo $\\{#fruits[@]\\} # Array length fruits+=("grape") # Append element ### Declaraciones Condicionalesbash

if-then-else

if [ condition ]; then echo "Condition is true" elif [ other_condition ]; then echo "Other condition is true" else echo "No condition is true" fi

Test conditions

if [ "\(var" = "value" ]; then # String equality if [ "\)num" -eq 10 ]; then # Numeric equality if [ "\(num" -gt 5 ]; then # Greater than if [ "\)num" -lt 20 ]; then # Less than if [ -f "file.txt" ]; then # File exists if [ -d "directory" ]; then # Directory exists if [ -r "file.txt" ]; then # File is readable if [ -w "file.txt" ]; then # File is writable if [ -x "script.sh" ]; then # File is executable

Logical operators

if [ condition1 ] && [ condition2 ]; then # AND if [ condition1 ]||[ condition2 ]; then # OR if [ ! condition ]; then # NOT

Case statement

case $variable in pattern1) echo "Matched pattern1" ;; pattern2|pattern3) echo "Matched pattern2 or pattern3" ;; *) echo "No pattern matched" ;; esac ### Buclesbash

for loop

for i in \\{1..10\\}; do echo "Number: $i" done

for file in *.txt; do echo "Processing: $file" done

for item in "$\\{array[@]\\}"; do echo "Item: $item" done

C-style for loop

for ((i=1; i<=10; i++)); do echo "Counter: $i" done

while loop

counter=1 while [ $counter -le 10 ]; do echo "Counter: $counter" ((counter++)) done

until loop

counter=1 until [ $counter -gt 10 ]; do echo "Counter: $counter" ((counter++)) done

Loop control

for i in \\{1..10\\}; do if [ $i -eq 5 ]; then continue # Skip iteration fi if [ $i -eq 8 ]; then break # Exit loop fi echo $i done ### Funcionesbash

Function definition

function greet() \\{ echo "Hello, $1!" \\}

Alternative syntax

greet() \\{ echo "Hello, $1!" \\}

Function with return value

calculate_sum() \\{ local num1=\(1 local num2=\)2 local sum=$((num1 + num2)) echo $sum \\}

Function with local variables

process_file() \\{ local filename=\(1 local line_count=\)(wc -l < "$filename") echo "File $filename has $line_count lines" \\}

Function usage

greet "World" result=$(calculate_sum 5 3) echo "Sum: $result" ## Características Avanzadas de Bashbash

Basic parameter expansion

echo $\\{variable\\} echo $\\{variable:-default\\} # Use default if unset echo $\\{variable:=default\\} # Set default if unset echo $\\{variable:+alternate\\} # Use alternate if set echo $\\{variable:?error\\} # Error if unset

String manipulation

string="Hello, World!" echo $\\{string#Hello\\} # Remove shortest match from beginning echo $\\{string##/\\} # Remove longest match from beginning echo $\\{string%World!\\} # Remove shortest match from end echo $\\{string%%/\\} # Remove longest match from end echo $\\{string/Hello/Hi\\} # Replace first occurrence echo $\\{string//l/L\\} # Replace all occurrences

Substring extraction

echo $\\{string:0:5\\} # Extract substring (position:length) echo $\\{string:7\\} # Extract from position to end echo $\\{#string\\} # String length ### Expansión de Parámetrosbash

Arithmetic expansion

result=\(((5 + 3)) result=\)((10 * 2)) result=\(((20 / 4)) result=\)((17 % 5)) # Modulo

Increment/decrement

((counter++)) ((counter--)) ((counter += 5)) ((counter -= 3))

Arithmetic with variables

num1=10 num2=5 sum=\(((num1 + num2)) product=\)((num1 * num2))

Floating point arithmetic (using bc)

result=\((echo "scale=2; 10/3"|bc) result=\)(echo "scale=4; sqrt(16)"|bc -l) ### Operaciones Aritméticasbash

Exit on error

set -e # Exit on any error set -u # Exit on undefined variable set -o pipefail # Exit on pipe failure

Error handling in scripts

command||\\{ echo "Command failed" exit 1 \\}

Trap signals

trap 'echo "Script interrupted"; exit 1' INT TERM trap 'cleanup_function' EXIT

Function error handling

safe_command() \\{ if ! command_that_might_fail; then echo "Error: Command failed" >&2 return 1 fi \\} ### Manejo de Erroresbash

System-wide configuration

/etc/bash.bashrc # System-wide bashrc /etc/profile # System-wide profile

User-specific configuration

~/.bashrc # User's bashrc ~/.bash_profile # User's profile ~/.bash_login # Login shell configuration ~/.profile # POSIX shell profile ~/.bash_logout # Logout script ## Configuración y Personalizaciónbash

~/.bashrc example configuration

Source global definitions

if [ -f /etc/bashrc ]; then . /etc/bashrc fi

User specific environment

export EDITOR="vim" export BROWSER="firefox" export PAGER="less"

Custom PATH

export PATH="\(HOME/bin:\)HOME/.local/bin:$PATH"

Aliases

alias ll='ls -alF' alias la='ls -A' alias l='ls -CF' alias grep='grep --color=auto' alias fgrep='fgrep --color=auto' alias egrep='egrep --color=auto'

Custom functions

mkcd() \\{ mkdir -p "\(1" && cd "\)1" \\}

extract() \\{ if [ -f $1 ] ; then case $1 in *.tar.bz2) tar xjf $1 ;; *.tar.gz) tar xzf $1 ;; *.bz2) bunzip2 $1 ;; *.rar) unrar e $1 ;; *.gz) gunzip $1 ;; *.tar) tar xf $1 ;; *.tbz2) tar xjf $1 ;; *.tgz) tar xzf $1 ;; *.zip) unzip $1 ;; *.Z) uncompress \(1 ;; *.7z) 7z x \(1 ;; *) echo "'\)1' cannot be extracted via extract()" ;; esac else echo "'\)1' is not a valid file" fi \\}

Prompt customization

PS1='[\033[01;32m]\u@\h[\033[00m]:[\033[01;34m]\w[\033[00m]$ '

History configuration

HISTSIZE=10000 HISTFILESIZE=20000 HISTCONTROL=ignoredups:ignorespace shopt -s histappend

Shell options

shopt -s checkwinsize shopt -s globstar shopt -s cdspell ### Archivos de Configuración de Bashbash

Set options

set -o vi # Vi editing mode set -o emacs # Emacs editing mode (default) set -o noclobber # Prevent file overwriting set +o noclobber # Allow file overwriting

Shopt options

shopt -s autocd # Auto cd to directory shopt -s cdspell # Correct minor spelling errors shopt -s checkwinsize # Update LINES and COLUMNS shopt -s cmdhist # Save multi-line commands shopt -s dotglob # Include hidden files in globbing shopt -s expand_aliases # Expand aliases shopt -s extglob # Extended globbing shopt -s globstar # ** recursive globbing shopt -s histappend # Append to history file shopt -s nocaseglob # Case-insensitive globbing ### Personalizando .bashrcbash

Emacs mode (default)

Ctrl+A # Beginning of line Ctrl+E # End of line Ctrl+B # Back one character Ctrl+F # Forward one character Alt+B # Back one word Alt+F # Forward one word Ctrl+D # Delete character Ctrl+H # Backspace Ctrl+K # Kill to end of line Ctrl+U # Kill to beginning of line Ctrl+W # Kill previous word Alt+D # Kill next word Ctrl+Y # Yank (paste) Ctrl+T # Transpose characters Alt+T # Transpose words

Vi mode

set -o vi Esc # Enter command mode i # Insert mode a # Append mode A # Append at end of line I # Insert at beginning of line ### Opciones y Configuraciones de Bashbash

History commands

history # Show command history history 10 # Show last 10 commands history -c # Clear history history -d 5 # Delete history entry 5

History expansion

!! # Previous command !n # Command number n !string # Last command starting with string !?string # Last command containing string oldnew # Replace old with new in previous command

History search

Ctrl+R # Reverse search Ctrl+S # Forward search Ctrl+G # Cancel search

History configuration

export HISTSIZE=10000 # Commands in memory export HISTFILESIZE=20000 # Commands in file export HISTCONTROL=ignoredups # Ignore duplicates export HISTIGNORE="ls:ll:cd:pwd:bg:fg:history" # Ignore commands export HISTTIMEFORMAT="%F %T " # Add timestamps ## Edición de Línea de Comandos e Historialbash

Debug modes

bash -x script.sh # Execute with trace bash -n script.sh # Check syntax without execution bash -v script.sh # Verbose mode

Debug options in script

set -x # Enable trace set +x # Disable trace set -v # Enable verbose set +v # Disable verbose

Conditional debugging

if [ "$DEBUG" = "1" ]; then set -x fi

Debug function

debug() \\{ if [ "$DEBUG" = "1" ]; then echo "DEBUG: $*" >&2 fi \\} ### Edición de Línea de Comandosbash

Check command success

if command; then echo "Command succeeded" else echo "Command failed" fi

Check exit status

command if [ $? -eq 0 ]; then echo "Success" else echo "Failed with exit code $?" fi

Validate input

if [ $# -ne 2 ]; then echo "Usage: $0 " exit 1 fi

Check file existence

if [ ! -f "$filename" ]; then echo "Error: File $filename does not exist" exit 1 fi ### Gestión del Historialbash

Time command execution

time command time \\{ command1; command2; \\}

Profile script execution

PS4='+ $(date "+%s.%N"): ' set -x

Your commands here

set +x

Memory usage

/usr/bin/time -v command

Disk usage

du -sh directory/ df -h ## Depuración y Resolución de Problemasbash

Use full paths for commands

/bin/ls instead of ls /usr/bin/find instead of find

Validate input

case "$input" in [a-zA-Z0-9]*) # Valid input ;; *) echo "Invalid input" exit 1 ;; esac

Quote variables

rm "$filename" # Correct rm $filename # Dangerous

Use arrays for file lists

files=( *.txt ) for file in "\(\\\\{files[@]\\\\}"; do process "\)file" done ### Depurando Scriptsbash

Use built-in commands when possible

[[ condition ]] # Instead of [ condition ] (( arithmetic )) # Instead of [ arithmetic ]

Avoid unnecessary subshells

var=\((cat file) # Subshell var=\)(<file) # Built-in

Use parameter expansion

$\\{var#pattern\\} # Instead of sed/awk for simple operations $\\{var%pattern\\} $\\{var/pattern/replacement\\}

Efficient loops

while IFS= read -r line; do # Read file line by line process "$line" done < file.txt ### Verificación de Erroresbash

Use functions for repeated code

log_message() \\{ echo "[$(date '+%Y-%m-%d %H:%M:%S')] $*" >&2 \\}

Separate configuration

CONFIG_FILE="\(\\\\{HOME\\\\}/.myapp.conf" if [ -f "\)CONFIG_FILE" ]; then source "$CONFIG_FILE" fi

Use meaningful variable names

user_count=10 # Good uc=10 # Poor

Comment complex logic

Calculate the number of days between two dates

start_date=\((date -d "\)1" +%s) end_date=\((date -d "\)2" +%s) days=$(( (end_date - start_date) / 86400 )) ```### Monitoreo de Rendimiento