笔记 - 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"
位置参数变量
特殊变量
数组变量
关联数组变量
相关推荐
大哥_ZH4 分钟前
Linux umami在国产麒麟系统安装网站统计工具(只能上国内网站的系统)
linux·服务器
LuH11247 分钟前
【论文阅读笔记】Scalable, Detailed and Mask-Free Universal Photometric Stereo
论文阅读·笔记
o(╥﹏╥)19 分钟前
在 Ubuntu 上安装 VS Code
linux·运维·vscode·ubuntu·vs
不爱学英文的码字机器1 小时前
[Linux] Shell 命令及运行原理
linux·运维·服务器
cdut_suye1 小时前
Linux工具使用指南:从apt管理、gcc编译到makefile构建与gdb调试
java·linux·运维·服务器·c++·人工智能·python
qq_433618441 小时前
shell 编程(三)
linux·运维·服务器
Tlzns1 小时前
Linux网络——UDP的运用
linux·网络·udp
码农土豆1 小时前
PaddlePaddle飞桨Linux系统Docker版安装
linux·docker·paddlepaddle
Hacker_xingchen2 小时前
天融信Linux系统安全问题
linux·运维·系统安全
张暮笛2 小时前
抓取手机HCI日志
linux