Linux中shell脚本——脚本基础、变量、时间同步

目录

一.shell的作用

1.1.Shell脚本及处理逻辑

​1.2.shell脚本练习

二.shell变量

2.1.变量的作用

2.2.变量名要求

2.3.变量类型

2.4.主要指执行脚本时后面所跟着位置

2.5.变量的作用范围


一.shell的作用

Linux 系统中的 Shell 是一个特殊的应用程序,它介于操作系统内核与用户之间,充当了一个“命令解释器”的角色,负责接收用户输入的操作指令(命令)并进行解释,将需要执行的操作传递给内核执行,并输出执行结果。

常见的 Shell 解释器程序有很多种,使用不同的 Shell 时,其内部指令、命令行提示符等方面会存在一些区别。通过/etc/shells 文件可以了解当前系统所支持的 Shell 脚本种类。

cat  /etc/shells可以查看当前系统支持的shell

查看本机的shell信息

cat /etc/shells

 Linux中常见的shell

    bash:基于gun的框架下发展的shell

    csh:类似c语言的shell

    tcsh:整合了csh提供了更多功能

    sh:已经被bash替换

    nologin:让用户无法登录

    bash (/bin/bash)是目前大多数Linux 版本采用的默认shell

shell脚本用途

  • 将简单的命令组合完成复杂的工作,自动化执行命令,提高工作效率

  • 减少手工命令的重复输入,一定程度上避免人为错误

  • 将软件或应用的安装及配置实现标准化

  • 用于实现日常性的,重复性的运维工作,如:文件打包压缩备份,监控系统运行状态并实现告警等

1.1.Shell脚本及处理逻辑

①Shell脚本就是将命令按顺序一一列出的程序,最后自动执行。shell脚本将简单的命令组合完成负责的工作,自动化执行命令,提高工作效率,可以用于日常性重复性的运维工作。

②处理逻辑分为三种:

顺序执行:程序按从上到下的顺序执行

选择执行:程序执行过程中,根据条件的不同选择不同的分支继续执行

循环执行:程序在执行过程中需要重复执行多次某些语句(根据已知次数、已知条件)

shell脚本基本格式

    #!/bin/bash           #脚本声明即解释器,表示此行以下的代码通过/bin/bash程序翻译执行
     
    #this is my frist  shell       #注释信息,描述此脚本做什么工作或每条语句的含义
     
    echo " hello world! "        #可执行语句,脚本具体的内容

1.2.shell执行方式

调用系统shell执行不需要给脚本加可执行(x)权限,不改变当前环境。执行格式shell +脚本名称
例如:bash  abc.sh
 
使用路径执行脚本,需要给脚本加可执行(x)权限,不改变当前环境
添加脚本权限  chmod +x abc.sh
绝对路径执行  /mnt/a.sh
相对路径执行,进入对应目录直接执行  ./abc.sh
 
通过 . 或者source 来执行脚本,需要给脚本加可执行(x)权限,这俩种方式会改变当前环境不建议使用
添加脚本权限 chmod +x abc.sh
使用.执行脚本.  abc.sh
使用source执行脚本  source  abc.sh
 
bash -n 脚本名称 (绝对路径)     检查语法错误
bash -x 脚本名称 (绝对路径)     检查逻辑错误

执行方式:

(1)指定路径去执行文件(文件需要有执行权限)

(2)指定解释器去执行(文件不需要权限)

(3)使用source或点“.”执行(不需要执行权限)

查看系统程序

$PATH

1.2.shell脚本练习

 

 

二.shell变量

Shell 脚本中的变量是用于存储数据值或文本字符串的名称。变量允许您在脚本中临时保存数据,以便稍后使用。在 Shell 脚本中,您可以使用变量来存储命令输出、用户输入、中间结果等等。

在大多数 Shell(如 Bash)中,变量的命名是区分大小写的,并且通常使用大写字母。以下是如何在 Bash 中定义和使用变量的示例:

#!/bin/bash 

# 定义一个变量 
NAME="John" 

# 使用变量 echo "Hello, $NAME!" 

# 重新赋值变量 NAME="Alice" 
echo "Hello again, $NAME!" 

在这个示例中,我们定义了一个名为 NAME 的变量,将其设置为 "John",然后使用 echo 命令输出包含该变量的消息。然后,我们将变量重新赋值为 "Alice" 并再次输出。

还有一些特殊的变量,如:

  • $0:脚本名称。
  • $1$2、...:脚本的参数,其中 $1 是第一个参数,$2 是第二个参数,依此类推。
  • $#:参数的数量。
  • $@:所有参数的列表。
  • $?:上一个命令的退出状态(返回值)。
  • $$:当前 Shell 进程的进程 ID。

脚本错误调试:

脚本常见的错误有三种:语法错误,命令错误,逻辑错误

        1)语法错误,会导致后续的命令不继续执行,可以用bash -n 检查错误,提示的出错行数不一定是准确的

        2)命令错误,默认后续的命令还会继续执行,用bash -n 无法检查出来 ,可以使用 bash -x 进行观察

        3)逻辑错误:只能使用 bash -x 进行
                bash -n 脚本名称 (不在当前目录下加绝对路径)     检查语法错误
                bash -x 脚本名称 (不在当前目录下加绝对路径)     逻辑错误

2.1.变量的作用

 用来存放系统和用户需要使用的特定参数

2.2.变量名要求

  1. 区分大小写
  2. 不能使程序中的保留字和内置变量:如:if, for,hostname 命令 a=
  3. 只能使用数字、字母及下划线,且不能以数字开头,注意:不支持短横线 “ - ”,和主机名相反
  4. 不要使用内置的变量,使用英文尽量使用词义通俗易懂,PATH
  5. 大驼峰 StudentFirstName
  6. 小驼峰 studentFirstName
  7. 下划线 student_name

自定义变量格式:

变量名=变量值

#=号前后不能有空格

直接字串:name='root'
变量引用:name="$USER"
命令引用:name=`COMMAND` 或者 name=$(COMMAND)
注意:变量赋值是临时生效,当退出终端后,变量会自动删除,无法持久保存,脚本中的变量会随着脚本结束,也会自动删除

变量引用:
$name
${name}

弱引用和强引用
"$name " 弱引用,其中的变量引用会被替换为变量值,识别变量
'$name ' 强引用,其中的变量引用不会被替换为变量值,而保持原字符串;不识别变量,当成字符

$()或者` ` 直接调用命令

2.3.变量类型

常见的变量类型:

①只读变量:只可以读取不能修改的变量,相当于常量,用处较少

readonly 变量名 #将变量声明为只读变量

变量值不允许修改(重新赋值)的情况

无法使用 unset删除

最快方法重启

②环境变量:系统维护的变量,用于设置工作环境,使用env命令可以查看所有环境变量

  • $USER 表示用户名称

  • $HOME 表示用户的家目录

  • $LANG 表示语言和字符集

  • $PWD 表示当前所在工作目录

  • $PATH 表示可执行用户程序的默认路径

  • 由系统提前创建,用来设置用户的工作环境

  • 可以使用env查看所有环境变量

  • 需要记住的常用环境变量

环境变量的全局配置文件:

/etc/profile     #配置文件位置
                     #修改此文件,全局生效,可用于长期变更或设置环境变量

整数变量:

expr只能进行整数的运算

格式: expr 变量1 运算符 变量2 [运算符 变量3]

运算符:加法 +       减法 -        乘法 \ *         除法 /         取余 (取模)%

#运算法则
加法:num1 + num2
减法:num1 - num2
乘法:num1 \ * num2
整除:num1 / num2
取余(求模):num1 % num2 (求 num1 除以 num2 的余数)

变量和运算符之间要用空格隔开

加法运算:

(1) let var=算术表达式

(2) $((var=算术表达式)) 和上面等价

(3) var= $[算术表达式]

(4) var=$((算术表达式))

(5) var=$(expr arg1 arg2 arg3 ...)

(6) var= `expr arg1 arg2 arg3 ...`

(7) echo '算术表达式' | bc

④位置变量

$1, $2, $3, … $n 表示命令行参数的位置值,位置变量也称为位置参数

$1 表示第一个参数,$2 表示第二个参数,以此类推。

当n大于9时,需要加上{ },比如第十个位置,要用 ${10}表示

echo "$1"              位置1
echo "$2"              位置2
echo "${10}"          位置10
echo "$10"            位置1和0
echo "$*"              将所有项当成一个值
echo "$@"            所有项
echo "$0"             脚本自身
echo "$#"             后面参数的个数

$0                        表示当前脚本的名字
 

⑤预定义变量***

$*:表示所有位置参数的内容看成一个整体返回 返回所有

$@:表示所有位置参数的内容分割成n份,每份作为一个独立的个体返回 返回所有

$?:表示前一条命令执行后的返回状态,返回值为 0 表示执行正确,返回任何非 0值均表示执行出现异常

$#:表示命令行中位置参数的总个数

$0:表示当前执行的脚本或程序的名称 当前脚本的名字

$$:当前进程id

$!: 后台任务最后一个id

2.4.read -p

read -p 是 Bash 脚本中常用的命令组合,用于从用户获取输入并存储到变量中。这个命令允许您在运行脚本时与用户进行交互,以便动态地获取输入值。

read -p 命令的语法如下:

read -p "prompt_message" variable_name

其中:

  • -p 选项表示在请求输入之前,显示一个提示信息给用户。
  • "prompt_message" 是您希望显示给用户的提示消息。
  • variable_name 是您希望将用户输入存储到的变量的名称。

以下是一个简单的示例,演示如何使用 read -p 命令来获取用户的名字并存储到变量中:

#!/bin/bash

# 请求用户输入名字并存储到变量
read -p "请输入您的名字: " NAME

# 显示用户输入的名字
echo "您好,$NAME!"

在这个示例中,read -p 命令提示用户输入名字,然后将输入的值存储到 NAME 变量中。接着,使用 echo 命令将用户输入的名字输出。

通过 read -p 命令,您可以轻松地与用户进行交互,接受输入,然后在脚本中使用这些输入来进行处理。

2.5.将局部变量变为全局变量

在 Bash 脚本中,变量的作用域通常是局部的,意味着它们只在定义它们的代码块内部可见。然而,有一些方法可以将局部变量变为全局变量,以便在整个脚本中访问它们。

局部变量:新定义的变量只在当前的shell环境中有效,当进入子程序或新的shell环境中,局部变量将无法再起作用。

全局变量:在新的shell环境中可以继续使用。

1. 使用 export 命令: 在 Bash 中,您可以使用 export 命令将局部变量导出为环境变量,从而使其成为全局变量。环境变量可以在整个脚本及其子进程中访问。

#!/bin/bash

# 定义局部变量
local_var="局部变量"

# 导出为全局变量
export global_var="$local_var"

# 在脚本中访问全局变量
echo "全局变量的值为:$global_var"

2.在主 Shell 进程中定义: 如果您在交互式 Shell 中运行脚本,您可以将变量直接定义在主 Shell 进程中,使其成为全局变量。

3. 使用 . 命令(点命令)或 source 命令: 这两个命令允许您在当前 Shell 进程中执行脚本,从而使脚本中的变量在当前 Shell 环境中可见。

#!/bin/bash

# 将脚本内容放在一个文件中,例如 script.sh
# 定义局部变量
local_var="局部变量"

# 在当前 Shell 中运行脚本
. ./script.sh

# 在当前 Shell 中访问脚本中的变量
echo "在当前 Shell 中访问变量:$local_var"

要注意的是,直接在主 Shell 进程中定义变量、使用环境变量以及通过 . 命令或 source 命令执行脚本都可以将局部变量变为全局变量,但这也可能会导致命名冲突或不必要的变量污染。确保您了解全局变量的作用范围,并谨慎使用,以避免出现意外的问题。


2.5.主要指执行脚本时后面所跟着位置

$1-$9:脚本后1-9的位置

${10}:脚本后10以上的位置需要借助变量分隔符{},不然会将$1认为是一个位置变量然后输出再加上后面的数字。

$*:表示所有位置参数的内容看成一个整体返回

$@:表示输出脚本后的所有位置参数,且认为每个是独立的值

$0:表示当前执行的脚本或程序的名称 当前脚本的名字

$#:表示命令行中位置参数的总个数

$?:表示前一条命令执行后的返回状态,返回值为 0 表示上一条命令执行正确,返回任何非 0值均表示执行出现异常。使用方法echo  $?

$!:后台任务最后一个id,使用方法echo  $!

2.5.变量的作用范围

默认情况下,新定义的变量只在当前的shell环境中有效,因此称为局部变量,当进入子程序或新的shell环境中,局部变量将无法再起作用。

可以通过内部命令export将指定的变量为全局变量,使用户定义的变量在所有子shell环境中可以继续使用

全局变量格式1: export   变量名    

全局变量格式2:export 变量名=变量值

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值