#!/bin/bash show_help() { cat << EOF Usage: bash-helper [OPTIONS] [COMMAND] [FILTER] Interactive bash command helper with fzf or direct CLI usage. OPTIONS: -h, --help Show this help message -i, --interactive Force interactive mode (default if no args) -l, --list List all available commands MODES: 1. Interactive (default): bash-helper 2. Direct lookup: bash-helper COMMAND [FILTER] Examples: bash-helper ls # Show all flags for ls bash-helper ls size # Show ls flags containing "size" bash-helper grep -i # Show grep flags containing "-i" COMMANDS: Available commands: ls, cd, pwd, cp, mv, rm, mkdir, rmdir, grep, find, echo DEPENDENCIES: fzf - Required for interactive mode only EXAMPLES: bash-helper # Interactive mode with fzf bash-helper ls # Show all ls flags bash-helper grep recursive # Show grep flags about recursion bash-helper --list # List all available commands EOF } show_flags() { CMD_NAME=$1 FILTER=$2 # Colors RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[0;33m' BLUE='\033[0;34m' NC='\033[0m' # No Color echo -e "${BLUE}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}" echo -e "${YELLOW}Flags for: ${GREEN}$CMD_NAME${NC}" if [ -n "$FILTER" ]; then echo -e "${YELLOW}Filter: ${GREEN}$FILTER${NC}" fi echo -e "${BLUE}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}" echo "" if type "$CMD_NAME" | grep -q "shell builtin"; then if [ -n "$FILTER" ]; then help "$CMD_NAME" | grep -E ' -' | grep -i "$FILTER" else help "$CMD_NAME" | grep -E ' -' fi elif command -v "$CMD_NAME" &> /dev/null; then if [ -n "$FILTER" ]; then man "$CMD_NAME" 2>/dev/null | col -b | grep -E '^\s*-' | grep -i "$FILTER" || \ man "$CMD_NAME" 2>/dev/null | col -b | grep -E ' -' | grep -i "$FILTER" else man "$CMD_NAME" 2>/dev/null | col -b | grep -E '^\s*-' || \ man "$CMD_NAME" 2>/dev/null | col -b | grep -E ' -' fi else echo -e "${RED}Could not find help for: $CMD_NAME${NC}" echo "" echo "Make sure the command is installed or check the spelling." return 1 fi echo "" echo -e "${BLUE}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}" } list_commands() { echo "Available commands:" echo "" for cmd in "${COMMANDS[@]}"; do CMD_NAME=${cmd%%:*} DESC=${cmd#*:} printf " %-10s - %s\n" "$CMD_NAME" "$DESC" done } get_command_description() { local search_cmd=$1 for cmd in "${COMMANDS[@]}"; do CMD_NAME=${cmd%%:*} DESC=${cmd#*:} if [ "$CMD_NAME" = "$search_cmd" ]; then echo "$DESC" return 0 fi done echo "Command help" } # Command definitions COMMANDS=( "ls:List directory contents" "cd:Change the current directory" "pwd:Print the name of the current working directory" "cp:Copy files and directories" "mv:Move or rename files and directories" "rm:Remove files or directories" "mkdir:Create a new directory" "rmdir:Remove an empty directory" "grep:Print lines matching a pattern" "find:Search for files in a directory hierarchy" "echo:Display a line of text" ) # Parse arguments INTERACTIVE=false COMMAND="" FILTER="" if [ $# -eq 0 ]; then INTERACTIVE=true else case "$1" in -h|--help) show_help exit 0 ;; -l|--list) list_commands exit 0 ;; -i|--interactive) INTERACTIVE=true ;; -*) echo "Unknown option: $1" echo "Use --help for usage information" exit 1 ;; *) COMMAND=$1 FILTER=$2 ;; esac fi # Interactive mode with fzf if [ "$INTERACTIVE" = true ]; then # Check if fzf is available if ! command -v fzf &> /dev/null; then echo "Error: fzf is not installed" echo "Install it with: sudo apt install fzf" echo "" echo "Or use direct mode: bash-helper COMMAND [FILTER]" exit 1 fi FZF_COMMAND=$(printf "%s\n" "${COMMANDS[@]}" | fzf --height 40% --border --preview 'echo {}' --preview-window=up:1:wrap) if [ -n "$FZF_COMMAND" ]; then CMD=${FZF_COMMAND%%:*} DESC=${FZF_COMMAND#*:} echo "" echo -e "\033[0;34m═══════════════════════════════════════════════════════════\033[0m" echo -e "\033[0;32mCommand:\033[0m $CMD" echo -e "\033[0;32mDescription:\033[0m $DESC" echo -e "\033[0;34m═══════════════════════════════════════════════════════════\033[0m" echo "" read -p "Filter flags (optional, press Enter to skip): " FILTER echo "" show_flags "$CMD" "$FILTER" else echo "No command selected" exit 0 fi # Direct mode elif [ -n "$COMMAND" ]; then # Validate command exists in our list FOUND=false for cmd in "${COMMANDS[@]}"; do CMD_NAME=${cmd%%:*} if [ "$CMD_NAME" = "$COMMAND" ]; then FOUND=true DESC=${cmd#*:} break fi done if [ "$FOUND" = false ]; then echo "Warning: '$COMMAND' is not in the predefined list" echo "Available commands:" list_commands echo "" echo "Attempting to show flags anyway..." echo "" fi # Show command info DESC=$(get_command_description "$COMMAND") echo "" echo -e "\033[0;34m═══════════════════════════════════════════════════════════\033[0m" echo -e "\033[0;32mCommand:\033[0m $COMMAND" echo -e "\033[0;32mDescription:\033[0m $DESC" echo -e "\033[0;34m═══════════════════════════════════════════════════════════\033[0m" echo "" show_flags "$COMMAND" "$FILTER" else show_help exit 1 fi