shell基础学习及变量与输出

什么是shell

说白了,Shell就是你跟Linux内核之间的翻译官——你把命令敲给它,它翻译成系统调用丢给内核去执行。

常见的Shell有这几种:

Shell

特点

用在哪

bash

Linux默认,功能最全

写脚本首选

sh

最古老,兼容性好

追求兼容时用

zsh

macOS默认,交互体验好

日常敲命令

dash

极致轻量

Debian/Ubuntu的/bin/sh

什么是Shell脚本

说白了就是把一堆命令写到一个文件里,给个执行权限,一次跑完——不用一条条敲。

方式

手动敲

Shell脚本

执行

一条条交互

批量自动跑

复用

❌ 每次重敲

✅ 写一次反复用

排错

❌ 敲错就重来

✅ 看日志改脚本

定时

❌ 要手动crontab

✅ 脚本+crontab自动化

交接

❌ 靠嘴说

✅ 把脚本丢给同事

脚本的基本写法

 #!/bin/bash
 //脚本第一行, #!魔法字符,指定脚本代码执行的程序。即它告诉系统这个脚本需要什么解释器来执行,也就是使用
 哪一种Shell
 ​
 #代表注释,#!特例
 ​
 //以下内容是对脚本的基本信息的描述,大家可以根据实际情况尽可能的写详细一些,方便后续使用者
 # Name: 脚本名字
 # Desc:描述describe
 # Path:存放路径
 # Usage:用法
 # Update:更新时间
 # Author:作者
 # Release: 分发版本
 ​
 //下面就是脚本的具体内容
 commands
 ...

脚本如何跑起来

下面是脚本内容:

 #!/bin/bash
 # 文件名: hello.sh
 # 功能: 第一个Shell脚本
 ​
 echo "Hello,运维工程师!"
 echo "当前时间: $(date)"
 echo "当前用户: $(whoami)"
 echo "当前目录: $(pwd)"
 # 给执行权限+运行
 chmod +x hello.sh
 ./hello.sh
 ​
 # 或者直接用bash解释执行(不需要执行权限)
 bash hello.sh

方式

开新进程?

变量影响当前Shell?

什么时候用

./script.sh

✅

❌

日常跑脚本

bash script.sh

✅

❌

测试/没执行权限时

source script.sh

❌

✅

加载环境变量/切换目录

变量与参数

怎么定义变量?

 #!/bin/bash
 ​
 # 定义变量(等号两边绝不能有空格!)
 name="张三"
 age=25
 port=8080
 ​
 # 使用变量(加$符号)
 echo "姓名: $name"
 echo "年龄: $age"
 echo "端口: $port"
 ​
 # 花括号明确边界(推荐写法,防止粘连)
 host="192.168.8.50"
 echo "服务地址: ${host}:${port}"
 ​
 # 只读变量
 readonly company="ABC科技"
 # company="新公司"    ← 这行会报错!
 ​
 # 删除变量
 unset age
 echo "age=$age"    # 输出 age= (空了)

易错点提醒:name = "张三"←等号两边有空格,直接报错command not found。这是新手踩坑第一名。

变量默认值——没传就用兜底值:

 # ${var:-默认值} → var没值就用默认(不改var本身)
 port=${PORT:-8080}
 ​
 # ${var:=默认值} → 同上,但会把默认值赋给var
 echo ${NAME:=admin}
 ​
 # ${var:?错误信息} → 没值直接报错退出
 config=${CONFIG_FILE:?必须传入CONFIG_FILE环境变量}
 ​
 # ${var:+代替值} → var有值时用代替值
 debug=${DEBUG:+--verbose}

2.2 三种引号,傻傻分不清?

 name="张三"
 ​
 # 双引号 → 变量会解析
 echo "你好,$name"          # 输出: 你好,张三
 ​
 # 单引号 → 原样输出,啥都不解析
 echo '你好,$name'          # 输出: 你好,$name
 ​
 # $() → 执行命令拿结果
 echo "今天是$(date +%F)"    # 输出: 今天是2026-07-22

一张表记牢:

引号

变量解析

命令执行

什么时候用

双引号""

✅

❌

拼接变量和字符串

单引号''

❌

❌

纯文本,谁也不变

$()

✅

✅

拿命令的输出

易错点提醒:echo "今天是$date"和echo "今天是$(date)"不是一回事!前者打印变量$date的值(大概率是空的),后者执行date命令拿当前时间。