杰瑞科技汇

Linux shell教程,如何快速入门?

Linux Shell 完整教程:从入门到精通

目录

  1. 第一部分:初识 Shell

    Linux shell教程,如何快速入门?-图1
    (图片来源网络,侵删)
    • 什么是 Shell?
    • 为什么学习 Shell?
    • 如何打开 Shell(终端)?
    • 第一个命令:Hello, World!
  2. 第二部分:Shell 基础入门

    • 命令的基本结构
    • 文件和目录导航 (ls, cd, pwd)
    • 文件和目录操作 (mkdir, touch, cp, mv, rm)
    • 查看文件内容 (cat, less, head, tail)
    • 文件权限 (chmod, chown)
  3. 第三部分:核心概念与技巧

    • 输入输出重定向 (>, >>, <)
    • 管道 ()
    • 通配符 (, , [])
    • 命令历史与快捷键
    • 用户与权限 (sudo, su)
  4. 第四部分:Shell 脚本编程入门

    • 什么是 Shell 脚本?
    • 第一个脚本:hello.sh
    • 变量
    • 参数传递 ($1, $2, , )
    • 条件判断 (if-then-else)
    • 循环 (for, while)
  5. 第五部分:进阶与实用技巧

    Linux shell教程,如何快速入门?-图2
    (图片来源网络,侵删)
    • 函数
    • 使用别名 (alias)
    • 任务控制 (&, jobs, fg, bg)
    • 文本处理三剑客 (grep, sed, awk) - 简介
    • 调试脚本 (set -x, echo)
  6. 第六部分:推荐资源与学习路径


第一部分:初识 Shell

什么是 Shell?

你可以把 Shell 想象成是用户与 Linux 内核之间的翻译官,你通过 Shell 输入命令,Shell 解释这些命令并告诉内核该做什么,然后将内核的执行结果反馈给你。

  • 图形用户界面:通过点击图标、菜单来操作,直观但不够灵活。
  • 命令行界面:通过输入文本命令来操作,学习曲线稍陡,但功能极其强大和高效。

Linux 中最常用的 Shell 是 Bash (Bourne Again Shell),大多数 Linux 发行版默认都使用它。

为什么学习 Shell?

  1. 自动化:编写脚本可以自动执行重复性任务,如备份文件、部署应用、监控系统等。
  2. 效率:熟练使用 Shell 可以让你快速完成复杂的文件操作和系统管理任务。
  3. 服务器管理:绝大多数服务器(如 Web 服务器、数据库服务器)没有图形界面,管理它们完全依赖于 Shell。
  4. 深入理解系统:通过 Shell,你可以直接与操作系统核心交互,更好地理解其工作原理。

如何打开 Shell(终端)?

  • 在桌面环境中,通常可以按 Ctrl + Alt + T 快速打开终端。
  • 在应用程序菜单中搜索 "Terminal" 或 "终端"。
  • 在服务器上,登录系统后你直接就进入了 Shell 环境。

第一个命令:Hello, World!

打开终端后,你会看到一个提示符,通常类似 user@hostname:~$

Linux shell教程,如何快速入门?-图3
(图片来源网络,侵删)

输入以下命令并按回车:

echo "Hello, World!"

解释

  • echo 是一个命令,用于在终端输出指定的文本。
  • "Hello, World!"echo 命令的参数,也就是要输出的内容。

恭喜!你已经成功执行了你的第一个 Shell 命令。


第二部分:Shell 基础入门

命令的基本结构

command [options] [arguments]
  • command: 你要执行的命令,如 ls, cd
  • options: 选项,用来修改命令的行为,通常以 或 开头,如 -l, --help
  • arguments: 参数,命令作用的对象,如文件名、目录名。

示例

ls -l /home
  • ls: 列出文件和目录的命令。
  • -l: 选项,表示以“长格式”(详细信息)显示。
  • /home: 参数,表示要列出 /home 目录下的内容。

文件和目录导航

  • pwd (Print Working Directory): 显示你当前所在的目录。

    pwd
    # 输出: /home/user
  • ls (List): 列出当前目录下的文件和目录。

    ls              # 列出文件名
    ls -l           # 列出详细信息(权限、所有者、大小、日期)
    ls -a           # 列出所有文件,包括隐藏文件(以 . 开头)
    ls -la          # 组合使用,列出所有文件的详细信息
  • cd (Change Directory): 切换目录。

    cd /var/log     # 切换到 /var/log 目录
    cd ..           # 切换到上一级目录
    cd ~            # 切换到当前用户的家目录 (/home/user)
    cd -            # 切换到上一次所在的目录

文件和目录操作

  • mkdir (Make Directory): 创建新目录。

    mkdir my_folder      # 创建一个名为 my_folder 的目录
    mkdir -p dir1/dir2   # 创建嵌套目录,-p 确保父目录存在
  • touch: 创建一个空文件或更新文件的时间戳。

    touch new_file.txt
  • cp (Copy): 复制文件或目录。

    cp file1.txt file2.txt      # 复制文件
    cp -r my_folder my_backup   # 复制目录,-r 表示递归(包含所有子文件和子目录)
  • mv (Move): 移动文件/目录,或重命名。

    mv file1.txt documents/    # 移动文件到 documents 目录
    mv file2.txt file3.txt     # 将 file2.txt 重命名为 file3.txt
  • rm (Remove): 删除文件或目录。

    rm file1.txt               # 删除文件
    rm -r my_folder            # 删除目录(危险!)
    rm -rf my_folder           # 强制删除目录(非常危险!请谨慎使用)

查看文件内容

  • cat (Concatenate): 一次性显示整个文件内容,适合查看短文件。

    cat long_file.log          # 如果文件很大,终端会快速滚屏
  • less: 分页显示文件内容,适合查看长文件。

    less long_file.log
    • less 中,你可以用 j/k 或上下箭头上下移动。
    • q 退出。
  • head / tail: 查看文件的开头或结尾部分。

    head -n 20 long_file.log   # 查看文件的前 20 行
    tail -n 20 long_file.log   # 查看文件的后 20 行
    tail -f long_file.log      # 实时追踪文件的更新(常用于查看日志)

文件权限

Linux 中,文件权限分为三类:所有者所属组其他人,每种身份都有三种权限:执行

  • chmod (Change Mode): 修改文件权限。

    • 数字表示法:

      • r (读) = 4
      • w (写) = 2
      • x (执行) = 1
      • 无权限 = 0
      • chmod 755 my_script.sh
        • 所有者: 7 (4+2+1) = rwx
        • 所属组: 5 (4+0+1) = r-x
        • 其他人: 5 (4+0+1) = r-x
    • 符号表示法:

      • chmod u+x my_script.sh:给所有者增加执行权限。
      • chmod g-w my_script.sh:给所属组移除权限。
      • chmod o+r my_script.sh:给其他人增加权限。
  • chown (Change Owner): 修改文件的所有者。

    chown user:group file.txt   # 将文件的所有者改为 user,所属组改为 group

第三部分:核心概念与技巧

输入输出重定向

默认情况下,命令的输出是标准输出,输入是标准输入,重定向可以改变这个默认行为。

  • >: 覆盖输出,将命令的输出结果写入文件,如果文件存在则覆盖。

    echo "Hello" > output.txt
  • >>: 追加输出,将命令的输出结果追加到文件末尾,如果文件不存在则创建。

    echo "World" >> output.txt
  • <: 输入重定向,让命令从文件中读取输入,而不是从键盘。

    sort < names.txt  # 对 names.txt 文件中的内容进行排序

管道 ()

管道将一个命令的标准输出作为另一个命令的标准输入,这就像把多个命令“串联”起来,形成一个强大的处理链。

示例:只显示当前目录下文件列表中包含 "log" 的行。

ls -la | grep "log"
  • ls -la 输出详细的文件列表。
  • 将这个输出传递给 grep 命令。
  • grep "log" 从输入中过滤出包含 "log" 的行并显示。

通配符

通配符用于匹配文件名。

  • 匹配任意数量的任意字符。

    ls *.txt          # 列出所有以 .txt 结尾的文件
    rm *.log          # 删除所有以 .log 结尾的文件
  • 匹配单个任意字符。

    ls file?.txt      # 匹配 file1.txt, file2.txt, 但不匹配 file10.txt
  • []: 匹配方括号中指定的任意一个字符。

    ls file[1-3].txt  # 匹配 file1.txt, file2.txt, file3.txt
    ls file[a-c].txt  # 匹配 filea.txt, fileb.txt, filec.txt

命令历史与快捷键

  • 命令历史

    • history: 显示你之前执行过的所有命令。
    • 重复执行上一条命令。
    • !n: 执行历史中第 n 条命令 (!42)。
    • !string: 执行历史中最近一个以 "string" 开头的命令 (!ls)。
  • 快捷键

    • Ctrl + C: 终止当前正在运行的命令。
    • Ctrl + Z: 暂停当前命令,并将其放入后台。
    • Ctrl + D: 输入文件结束符,相当于 exit,退出当前 Shell。
    • Ctrl + A: 光标移动到行首。
    • Ctrl + E: 光标移动到行尾。
    • Ctrl + R: 搜索命令历史(非常实用!)。

用户与权限

  • su (Switch User): 切换用户。

    su - username     # 切换到 username 用户,并加载其环境变量
  • sudo (Superuser do): 以超级用户(root)或其他用户的身份执行命令,这是推荐的做法,因为它不需要知道 root 用户的密码。

    sudo apt update   # 以管理员权限更新软件包列表 (Debian/Ubuntu)
    sudo yum install httpd # 以管理员权限安装 Apache 软件 (CentOS/RHEL)
    • 第一次使用 sudo 时会要求输入当前用户的密码。

第四部分:Shell 脚本编程入门

什么是 Shell 脚本?

Shell 脚本就是一个包含多条 Shell 命令的文本文件,通过执行这个文件,可以一次性运行所有命令,实现自动化任务。

第一个脚本:hello.sh

  1. 创建一个文件:

    touch hello.sh
  2. 用文本编辑器(如 nano, vim)打开文件并写入以下内容:

    #!/bin/bash
    # 这是一个注释
    echo "Hello from my first shell script!"
    # 创建一个目录并进入
    mkdir -p scripts
    cd scripts
    echo "I am now in the $(pwd) directory."
  3. 保存并退出

  4. 赋予执行权限

    chmod +x hello.sh
  5. 执行脚本

    ./hello.sh

    表示在当前目录下寻找并执行该文件。

第一行 #!/bin/bash 是 Shebang,它告诉系统这个脚本应该用哪个解释器(这里是 /bin/bash)来执行。

变量

  • 定义变量变量名=变量值 (注意: 两边不能有空格!)
    name="Alice"
    version=1.0
  • 使用变量:在变量名前加 符号。
    echo "Hello, $name"
    echo "Version: $version"
  • 只读变量:使用 readonly 命令,使其值不能被修改。
    readonly PI=3.14159
    # PI=4  # 这会报错
  • 删除变量:使用 unset 命令。
    unset version

参数传递

当执行脚本时,可以向脚本传递参数。

参数 含义
$0 脚本文件名
$1, $2, ... 脚本的第 1、2、... 个参数
传递给脚本的参数个数
所有参数,作为一个单个字符串
所有参数,作为多个独立的字符串

示例:创建一个 params.sh 脚本

#!/bin/bash
echo "Script name: $0"
echo "First argument: $1"
echo "Second argument: $2"
echo "Total arguments: $#"
echo "All arguments together: $*"
echo "All arguments separately: $@"
echo "Looping through arguments:"
for arg in "$@"
do
  echo "Argument: $arg"
done

执行:

chmod +x params.sh
./params.sh apple banana orange

条件判断 (if-then-else)

基本语法:

if [ condition ]
then
  # 如果条件为真,执行这里的代码
elif [ another_condition ]
then
  # 如果另一个条件为真,执行这里的代码
else
  # 如果以上条件都为假,执行这里的代码
fi

注意[]test 命令的别名,它们和条件之间必须有空格

常用条件判断

  • 文件判断:
    • -e filename: 文件是否存在
    • -f filename: 是否为普通文件
    • -d filename: 是否为目录
    • -r filename: 是否可读
    • -w filename: 是否可写
  • 数值判断:
    • num1 -eq num2: 等于
    • num1 -ne num2: 不等于
    • num1 -gt num2: 大于
    • num1 -lt num2: 小于
  • 字符串判断:
    • str1 == str2: 相等
    • str1 != str2: 不相等
    • -z str: 字符串长度是否为 0

示例check.sh

#!/bin/bash
if [ -f $1 ]
then
  echo "File $1 exists."
else
  echo "File $1 does not exist."
fi

执行:

./check.sh hello.sh  # 输出: File hello.sh exists.
./check.sh non_existent.txt # 输出: File non_existent.txt does not exist.

循环

  • for 循环:遍历一个列表。

    # 方法1: in 列表
    for i in 1 2 3 4 5
    do
      echo "Number: $i"
    done
    # 方法2: 遍历命令结果 (非常常用)
    echo "Files in current directory:"
    for file in $(ls)
    do
      echo "Found file: $file"
    done
  • while 循环:只要条件为真,就持续执行。

    # 计数器
    count=1
    while [ $count -le 5 ]
    do
      echo "Count is: $count"
      count=$((count + 1)) # ((count++)) 在某些 shell 中也有效
    done

第五部分:进阶与实用技巧

函数

将代码块封装成函数,便于复用。

#!/bin/bash
# 定义一个函数
greet() {
  echo "Hello, $1! Welcome to $2."
}
# 调用函数
greet "Bob" "Linux World"
greet "Alice" "Shell Scripting"

使用别名 (alias)

为常用的长命令创建简短的别名。

# 创建别名 (临时有效,重启终端后失效)
alias ll='ls -alF'
alias ..='cd ..'
# 让别名永久生效,需要将其写入配置文件
# 编辑 ~/.bashrc 或 ~/.zshrc 文件
echo 'alias ll="ls -alF"' >> ~/.bashrc
source ~/.bashrc # 重新加载配置文件

任务控制

  • &: 在命令末尾加上 &,可以让命令在后台运行,立即返回终端。
    sleep 30 & # sleep 命令会暂停 30 秒,但在后台运行,你可以立即输入下一个命令
  • jobs: 查看当前终端中所有后台运行的任务。
  • fg (Foreground): 将一个后台任务调到前台运行。
  • bg (Background): 将一个被暂停的任务(用 Ctrl+Z 暂停的)放到后台继续运行。

文本处理三剑客 (grep, sed, awk)

这是 Linux 文本处理的三大神器,功能强大,值得深入学习。

  • grep: 全局搜索正则表达式并打印,用于过滤行。

    ps aux | grep "nginx"  # 查找所有包含 "nginx" 的进程行
    grep -r "error" /var/log/ # 在 /var/log 目录下递归搜索包含 "error" 的行
  • sed: 流编辑器,用于编辑文本(如替换、删除、插入)。

    # 将文件中的 "apple" 替换为 "orange" (注意:默认不会修改原文件)
    sed 's/apple/orange/g' fruits.txt
    # 直接修改原文件 (谨慎使用)
    sed -i 's/apple/orange/g' fruits.txt
  • `awk``: 一种强大的报告生成器,用于处理**列。

    # 打印 /etc/passwd 文件的第 1 列 (用户名) 和第 6 列 (家目录)
    awk -F: '{print $1, $6}' /etc/passwd
    # 计算文件中数字的总和
    awk '{sum += $1} END {print sum}' numbers.txt

调试脚本

  • 在脚本开头加入 set -x:这会打印出所有执行的命令及其参数,非常适合调试。

    #!/bin/bash
    set -x # 开启调试模式
    name="Test"
    echo "The name is $name"

    执行时会看到:

    + name=Test
    + echo 'The name is Test'
    The name is Test
  • 使用 echo:在关键变量或逻辑分支处插入 echo 命令,打印出变量的值或程序的执行流程。


第六部分:推荐资源与学习路径

学习路径建议

  1. 熟练掌握基础:每天花时间练习第二、三部分的所有命令,直到能不假思索地使用它们,这是最重要的基石。
  2. 动手写脚本:从简单的自动化任务开始,
    • 一个备份脚本,将指定目录压缩并备份到另一个位置。
    • 一个日志分析脚本,统计某个错误出现的次数。
  3. 深入学习文本处理grep, sed, awk 是区分初级和中级用户的关键,先从 grep 开始,掌握 sed 的替换功能,再逐步学习 awk
  4. 阅读他人脚本:在 GitHub 等平台上寻找优秀的开源项目,阅读他们的 Shell 脚本,学习别人的编程风格和技巧。
  5. 探索更高级的主题:如信号处理、进程通信、更复杂的变量展开等。

推荐资源

  • 交互式学习网站

  • 在线书籍与教程

  • 练习环境

    • 虚拟机:安装 VirtualBox 或 VMware,然后在里面安装一个 Linux 发行版(如 Ubuntu Server)进行练习。
    • 云服务器:在阿里云、腾讯云等平台购买一台便宜的云服务器,这是最接近真实生产环境的练习方式。
  • 社区

    • Stack Overflow: 遇到问题,先在这里搜索。
    • Linux 相关论坛和 IRC 频道:与其他爱好者交流。

学习 Shell 是一个持续实践的过程,不要害怕犯错,大胆地去尝试、去组合命令、去编写你自己的脚本,祝你学习愉快!

分享:
扫描分享到社交APP
上一篇
下一篇