自学内容网 自学内容网

SHELL笔记(概念+变量)

shell 概念

Shell 是一个命令行解释器,它充当用户与操作系统内核之间的桥梁。用户在 Shell 环境下输入各种命令,Shell 负责接收并分析这些命令,然后将其转换为内核能够理解和执行的系统调用。通过这种方式,用户可以便捷地操作计算机系统,完成诸如文件和目录操作、进程管理、系统配置、网络管理等一系列复杂的任务。

常见的 Shell 类型众多,其中 Bourne Shell(sh)是早期 UNIX 系统广泛使用的一种 Shell;C Shell(csh)在语法上与 C 语言有相似之处,具有独特的交互特性;Korn Shell(ksh)综合了其他 Shell 的优点;而 Bash(Bourne Again Shell)是目前大多数 Linux 系统默认的 Shell,它继承了 Bourne Shell 的语法,同时融合了其他 Shell 的优秀特性,功能强大且应用广泛。

shell 编写规范

  1. 首行声明
    Shell 脚本的首行用于指定脚本的解释器。对于 Bash 脚本,通常使用#!/bin/bash。这一行至关重要,它告诉操作系统使用何种解释器来执行后续的脚本内容。如果是其他类型的 Shell 脚本,如使用 Python 作为解释器的脚本,首行可能是#!/usr/bin/python(具体路径根据系统实际安装情况而定)。

  2. 注释
    注释是提高脚本可读性的关键因素。在 Shell 脚本中,使用#来添加注释。注释可以出现在脚本的任何位置,用于解释脚本的功能、某一行或某一块代码的作用、变量的含义等。例如:

# This is a simple shell script to print "Hello, World!"
echo "Hello, World!"

多行注释可以使用以下方式:

:<<'xxxx'
comment1
comment2
comment3
……
xxxx
  1. 命名规范

    • 变量命名:变量名应具有清晰的含义,便于理解代码。一般采用小写字母和下划线组合的方式,例如user_namefile_path等。避免使用无意义或容易混淆的名称。
    • 函数命名:函数名同样需要遵循清晰易懂的原则,能够准确反映函数的功能。例如print_usagecalculate_sum等。
  2. 代码缩进
    虽然 Shell 脚本对缩进没有严格的语法要求,但为了提高代码的可读性,建议使用统一的缩进风格。通常可以使用四个空格或者一个制表符进行缩进,特别是在代码块结构(如if - else语句、for循环、while循环、函数定义等)中。例如:

if [ $condition ]; then
    action1
    action2
else
    action3
fi
  1. 语句分隔
    在 Shell 中,每条语句默认以换行符作为结束标志。不过,也可以在同一行中编写多条语句,此时需要使用分号;来分隔不同的语句。但为了保持代码的清晰性,尽量避免在一行中编写过多复杂的语句。例如:
command1; command2; command3

 

shell 变量

  1. 变量定义
    在 Shell 中,定义变量无需事先声明类型。变量的定义形式为变量名 = 值,注意等号两边不能有空格(除非值本身包含空格,此时需要用引号将值括起来)。例如:
var1=10
var2="hello world"
var3=$var1$var2

这里var1被赋值为数字 10,var2被赋值为字符串 “hello world”,var3则是将var1var2的值连接起来。

  1. 变量引用
    要使用变量的值,在变量名前加$符号。例如,如果定义了name="Alice",那么echo $name会输出 “Alice”。当变量名与其他字符连接时,为了避免歧义,可以使用${变量名}的形式。例如:
prefix="pre"
suffix="fix"
echo "${prefix}_${suffix}"

这会出 “pre_fix”。

  1. 环境变量
    环境变量是一种特殊的变量,它在整个系统环境中都有效,可以被系统中所有的进程访问。可以使用export命令来创建或修改环境变量。例如,要将一个新的目录添加到PATH环境变量中(PATH用于指定系统查找可执行文件的路径),可以使用以下命令:
export PATH=$PATH:/new/directory

一些常见的环境变量包括:

  • PATH:决定了 Shell 在哪些目录中搜索用户输入的命令对应的可执行文件
  • HOME:当前用户的主目录。
  • USER:当前用户名。
  • SHELL:当前使用的 Shell 的路径。
  1. 局部变量和全局变量
    • 局部变量在函数内部定义的变量通常是局部变量,其作用域仅限于该函数内部。例如:
function my_function() {
    local local_var="local value"
    echo $local_var
}
my_function
echo $local_var # 这里会报错,因为local_var在函数外部不可见
  • 全局变量在函数外部定义的变量一般是全局变量,可以在整个脚本中访问(包括函数内部)。但是,如果在函数内部对全局变量重新赋值,需要使用global关键字(在某些 Shell 中)或者通过export命令(在 Bash 中)来声明其为全局变量。例如:
global_var="global value"
function modify_global_var() {
    global_var="new global value"
    echo $global_var
}
modify_global_var
echo $global_var
  1. 特殊变量
    Shell 中有一些特殊变量,它们具有特定的含义和用途:
    • $0:代表脚本的名称。
    • $1$2...$n:分别代表传递给脚本的第 1 个、第 2 个、...、第 n 个参数。例如,如果脚本test.sh的内容为echo $1,执行./test.sh argument1会输出 “argument1”。
    • $#:表示传递给脚本的参数个数。
    • $@:代表所有参数的列表(以空格分隔),常用于遍历所有参数。
    • $*:也是所有参数的列表,但将所有参数视为一个整体。
    • $$:当前脚本的进程 ID。
    • $?:上一个命令的退出状态,0 表示命令执行成功,非 0 表示命令执行失败。例如:
ls non_existent_file
echo $? # 这里会输出非0的值,因为ls命令查找不存在的文件会失败

 

  • shell 环境变量存储的文件:

    • bash shell 初始化文件有:/etc/profile、 ~/.bash_profile、 ~/.bash_login、 ~/.profile、 ~/.bashrc、/etc/bashrc

    • 如图:

    • image-20230130154156590

    • /etc/profile :存放一些全局(共有)变量,不管哪个用户,登录时都会读取该文件。通常设置一些Shell变量PATH,USER,HOSTNAME和HISTSIZE等

    • ~/.bash_profile:每个用户都可使用该文件输入专用于自己使用的shell信息,当用户登录时,该文件仅仅执行一次,默认情况下,此文件通过脚本执行同目录下用户的.bashrc文件

    • ~/.bashrc:该文件包含专用于你的bash shell的bash信息,当登录时以及每次打开新的shell时,该该文件被读取

    • /etc/bashrc:为每一个运行bash shell的用户执行此文件.当bash shell被打开时,该文件被读取

    • /etc/inputrc文件为特定的情况处理键盘映射

    • 执行顺序:/etc/profile-->/etc/profile.d/*.sh--> ~/.bash_profile -->/etc/bashrc-->~./.bashrc

    • 结论:

      • 对于用户的环境变量设置,常见的是用户家目录下的.bashrc和.bash_profile

      • 对于全局环境变量设置,常见的文件有:/etc/profile /etc/bashrc /etc/profile.d 这三个配置文件,常用方法是直接在/etc/profile文件中写入全局变量,如果想要在登陆后初始化或者显示加载的内容,只需要把脚本文件放在 /etc/profile.d 文件下即可


原文地址:https://blog.csdn.net/2301_78537542/article/details/143834541

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!