教程

Shell 变量在赋值时即被创建。变量可以包含数字、字符或字符串。变量名区分大小写,通常由字母、数字和下划线(_)组成。

赋值通过 = 符号完成。注意:初始化变量时,= 两侧不能有空格。

PRICE_PER_APPLE=5
MyFirstLetters=ABC
greeting='Hello        world!'

引用变量

反斜杠 \ 用于转义特殊字符的含义。

PRICE_PER_APPLE=5
echo "The price of an Apple today is: \$HK $PRICE_PER_APPLE"

避免变量名歧义

使用 ${} 封装变量名可避免与后续字符产生歧义。

MyFirstLetters=ABC
echo "The first 10 letters in the alphabet are: ${MyFirstLetters}DEFGHIJ"

保留空格

使用双引号 "" 封装变量名将保留值中的所有空格。

greeting='Hello        world!'
echo "$greeting"
echo "$greeting now with spaces: $greeting"

命令替换

可以使用命令的输出值来为变量赋值,这称为命令替换(Command Substitution)。可以通过反引号 ` $() 包裹命令来完成替换。

FILELIST=`ls`
FileWithTimeStamp=/tmp/my-dir/file_$(/bin/date +%Y-%m-%d).txt

请注意,脚本运行时,它将在 $() 括号内运行命令并捕获其输出。

练习

本练习的目标是使用命令替换来创建字符串、整数和复杂变量。

  1. 字符串变量命名为 BIRTHDATE,应包含文本 "Jan 1, 2000"
  2. 整数变量命名为 Presents,应包含数字 10
  3. 复杂变量命名为 BIRTHDAY,应包含与 BIRTHDATE 日期匹配的星期几(例如 Saturday)。

注意,date 命令可用于将日期格式转换为其他格式。例如,要将日期值 $date1 转换为星期几,请使用:

date -d "$date1" +%A

教程代码

#!/bin/bash
# Change this code
BIRTHDATE=
Presents=
BIRTHDAY=


# Testing code - do not change it

if [ "$BIRTHDATE" == "Jan 1, 2000" ] ; then
    echo "BIRTHDATE is correct, it is $BIRTHDATE"
else
    echo "BIRTHDATE is incorrect - please retry"
fi
if [ $Presents == 10 ] ; then
    echo "I have received $Presents presents"
else
    echo "Presents is incorrect - please retry"
fi
if [ "$BIRTHDAY" == "Saturday" ] ; then
    echo "I was born on a $BIRTHDAY"
else
    echo "BIRTHDAY is incorrect - please retry"
fi

预期输出

BIRTHDATE is correct, it is Jan 1, 2000
I have received 10 presents
I was born on a Saturday

解决方案

#!/bin/bash
# Change this code
BIRTHDATE="Jan 1, 2000"
Presents=10
BIRTHDAY=`date -d "$BIRTHDATE" +%A`


# Testing code - do not change it

if [ "$BIRTHDATE" == "Jan 1, 2000" ] ; then
    echo "BIRTHDATE is correct, it is $BIRTHDATE"
else
    echo "BIRTHDATE is incorrect - please retry"
fi
if [ $Presents == 10 ] ; then
    echo "I have received $Presents presents"
else
    echo "Presents is incorrect - please retry"
fi
if [ "$BIRTHDAY" == "Saturday" ] ; then
    echo "I was born on a $BIRTHDAY"
else
    echo "BIRTHDAY is incorrect - please retry"
fi

系列教程导航

说明

  1. 命令替换风格:文中展示了反引号 ` $() 两种写法。在现代 Shell 脚本编写中,推荐优先使用 $() 语法,因其嵌套可读性更好。
  2. 命令兼容性:练习中使用的 date -d 参数属于 GNU date 命令(常见于 Linux 系统)。macOS 默认的 BSD date 命令不支持 -d 参数,若在 macOS 环境下运行可能需要调整日期处理命令。