笔记 - shell脚本

前言

Shell脚本是一种用来执行命令行命令的脚本文件。它是由一系列Shell命令组成的程序,通常用于自动化任务、系统管理、数据处理等。Shell脚本可以运行在各种Unix和Linux系统上,也可以在Windows上的一些兼容环境(如Cygwin、WSL)中运行。

组成部分

1、解释器声明:脚本文件的第一行通常是#!(称为shebang),后跟解释器路径,用于指定脚本运行时使用的解释器。例如,使用Bash解释器:

复制代码
#!/bin/bash

2、命令:Shell脚本由一系列Shell命令组成,每个命令在脚本中独立执行。

复制代码
echo "Hello, World!"

3、变量:可以定义和使用变量来存储数据。

复制代码
NAME="John"
echo "Hello, $NAME"

4、控制结构:包括条件语句(if、case)、循环(for、while)。

复制代码
if [ "$NAME" == "John" ]; then
    echo "Hello, John!"
else
    echo "Hello, $NAME!"
fi

5、函数等。

复制代码
#!/bin/bash

# 定义函数
function greet {
    echo "Hello, $1"
}

# 调用函数
greet "Alice"
greet "Bob"

三种执行方式的区别

1、./

  • 用途:使用当前目录下的解释器来执行脚本或可执行文件。
  • 解释器 :取决于脚本的第一行(shebang)指定的解释器。例如,如果脚本的第一行是 #!/bin/bash,那么使用./myscript.sh会执行myscript.sh文件,并使用Bash作为解释器。
  • 适用性:主要用于执行当前目录下的脚本或二进制文件,比如用户自定义的Shell脚本或者可执行文件。
  • 权限要求 :使用./来执行脚本,必须确保脚本文件具有可执行权限。

2、bash

  • 用途:显式地使用Bash解释器来执行脚本或命令。
  • 解释器:强制使用Bash解释器执行。不管脚本的shebang是什么,都会使用Bash来解释执行脚本。
  • 适用性:适合确保在不同系统上使用相同的Shell环境(Bash)来执行脚本,或者需要使用Bash特定功能的脚本。
  • 权限要求 :使用bash命令来执行脚本,不需要脚本文件本身有可执行权限,只要用户对脚本文件有读权限即可。这是因为bash命令会直接解释执行文件,而不依赖文件自身的可执行权限。

3、sh

  • 用途:使用系统默认的Shell解释器来执行脚本或命令。
  • 解释器:通常指向系统上的标准Shell(可能是Bourne Shell或其衍生版本),不一定是Bash。
  • 适用性 :保证脚本在不同UNIX系统上的兼容性,因为大多数UNIX系统都会安装一个标准的Shell解释器,比如Bourne Shell (sh)或其替代品。
  • 权限要求 :使用sh命令来执行脚本,同样不需要脚本文件本身有可执行权限,只要用户对脚本文件有读权限即可。sh命令也会直接解释执行文件,不依赖文件自身的可执行权限。

概念

输出

echo:用于在终端上输出文本或变量的值

  • -e:启用解释反斜杠转义字符。
  • -n:不在末尾添加换行符。
  • -E:禁用解释反斜杠转义字符(默认行为)。

当使用 -e 选项时,以下转义字符可以被解释:

  • \a:警告(响铃)

  • \b:退格

  • \c:抑制(不输出)其后的换行符

  • \e:转义字符

  • \f:换页

  • \n:换行

  • \r:回车

  • \t:水平制表符

  • \v:垂直制表符

  • \\:反斜杠

  • \nnn:八进制值 nnn(1 到 3 位数字)

  • \xHH:十六进制值 HH(1 到 2 位数字)

    #基础语法
    echo "hello world!"

    #输出重定向到文件
    echo "hello world!" > hello.txt

    #输出追加到文件末尾
    echo "hello world!" >> hello.txt

    #输出变量值,会输出hello, Alice
    name="Alice"
    echo "hello, $name"

    #使用-e选项启用转义字符解释,有个换行符号,所以会输出 hello

    world

    echo -e "hello\nworld"

输入

read:用于从标准输入读取一行,并将输入赋值给一个或多个变量。

  • -p:在读取输入前显示提示信息。

  • -r:禁止反斜杠转义(原样读取输入)。

  • -n:读取指定的字符数,而不是整行。

  • -s:隐藏输入的字符(适用于输入密码)。

  • -t:设置超时(秒),在超时后读取命令会自动退出。

  • -d:设置定界符,默认是换行符。

    #读取一行输入并存储在一个变量中,回车结束输入
    read name
    echo "Hello, $name"

    #提示信息,使用 -p 选项在读取前显示提示信息
    read -p "Enter your age: " age
    echo "You are $age years old."

    #使用 -r 选项禁止反斜杠转义
    read -r -p "Enter a file path: " filepath
    echo "The file path is: $filepath"

    #一次性读取多于一个变量
    echo "Enter your first name and last name:"
    read firstname lastname
    echo "Hello, firstname lastname"

    #设置读取字符数,使用 -n 选项读取指定数量的字符
    read -n 4 -p "Enter a 4-digit PIN: " pin
    echo "Your PIN is: $pin"

    #使用 -s 选项隐藏输入(适用于密码)
    read -s -p "Enter your password: " password
    echo
    echo "Your password is stored securely."

    #设置超时,使用 -t 选项设置读取输入的超时时间(秒)
    if read -t 5 -p "Enter your username (5 seconds timeout): " username; then
    echo "Hello, $username"
    else
    echo "Timed out!"
    fi

    #使用 -d 选项设置自定义的定界符(默认是换行符)
    read -d ';' -p "Enter input terminated by ';': " input
    echo "You entered: $input"

    #从文件中逐行读取输入
    while read line; do
    echo "Read line: $line"
    done < input.txt

变量
普通变量

普通变量用于存储数据,在当前Shell会话或脚本中使用。

复制代码
my_var="Hello, World!"
number=42
echo $my_var  # 输出: Hello, World!
echo $number  # 输出: 42
环境变量

环境变量是在当前Shell会话及其子进程中都可以使用的变量。它们通常用于配置系统和程序的行为。常见的环境变量:

·PATH:指定可执行文件的搜索路径。

·HOME:当前用户的主目录。

·USER:当前登录的用户名。

·SHELL:当前用户的默认Shell。

·PWD:当前工作目录。

·OLDPWD:前一个工作目录。

复制代码
#设置环境变量
export MY_ENV_VAR="Some value"
echo $MY_ENV_VAR  # 输出: Some value

#添加到PATH
export PATH="/my/custom/dir:$PATH"
位置参数变量
特殊变量
数组变量
关联数组变量
相关推荐
Mrdaliang几秒前
Linux系统性能优化
linux·运维·性能优化
LQYYDSY1 小时前
【C语言极简自学笔记】重讲运算符
c语言·开发语言·笔记
LPH31193 小时前
Linux系统安全管理
linux·网络·安全·系统安全
不太可爱的叶某人3 小时前
【学习笔记】深入理解Java虚拟机学习笔记——第7章 虚拟机类加载机制
java·笔记·学习
linux行者3 小时前
linux基础重定向及组合重定向
linux·运维
kikumaru7145 小时前
Mac 安装 finalshell
linux·网络·macos
爱上妖精的尾巴5 小时前
3-18 WPS JS宏 颜色设置实例应用(按条件设置单元格颜色)学习笔记
javascript·笔记·学习·excel·wps·js宏·jsa
哈哈浩丶6 小时前
Linux系统移植⑦:uboot启动流程详解-board_init_r执行过程
linux·驱动开发
mit6.8246 小时前
[Linux_core] “虚拟文件” | procfs | devfs | 上下文
linux·c语言·c++
teeeeeeemo6 小时前
JS数据类型检测方法总结
开发语言·前端·javascript·笔记