shell脚本编程规范与变量

本文详细介绍了Shell脚本的定义、作用及其在Linux系统中的重要性。讲解了如何学习和创建Shell脚本,包括脚本的构成、执行方式。此外,还深入探讨了重定向和管道操作,以及Shell变量的类型、赋值方法和特殊用法。内容涵盖了环境变量、只读变量、位置变量和预定义变量,是学习Shell编程的全面教程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、shell是什么

Shell是一个命令解释器,它在操作系统的最外层,负责直接与用户进行对话,把用户的输入解释给操作系统,并处理各种各样的操作系统的输出结果,输出到屏幕反馈给用户。这种对话方式可是交互也可以是非交互式的,我们所输入的命令计算机是不识别的,这时就需要一种程序来帮助我们进行翻译,变成计算机能识别的二进制程序,同时又把计算机生成的结果返回给我们。

二、shell的作用

Linux系统中的Shell是一个特殊的应用程序,它介于操作系统内核与用户之间,充当了一个“命令解释器”的角色,负责接收用户输入的操作指令(命令)并进行解释,将需要执行的操作传递给内核执行,并输出执行结果。
常见的 Shell 解释器程序有很多种,使用不同的 Shell 时,其内部指令、命令行提示符等方面会存在一些区别。通过/etc/shells 文件可以了解当前系统所支持的 Shell 脚本种类。

[root@localhost ~]# cat /etc/shells
/bin/sh #是bash命令的软链接 (已经被/bin/bash所替换)
/bin/bash 基准于GNU的框架下发展出的Shell。
/usr/bin/sh 已经被bash所替换。
/usr/bin/bash #centos和redhat系统默认使用bash shell
/bin/tcsh #csh的增强版,与csh完全兼容 整合了csh,提供更多的功能。
/bin/csh #已经被/bin/bash 所替换 (整合C shell,提供更多的功能)

注:nologin:奇怪的shell,这个shell可以让用户无法登录主机。
bash ( /bin/bash)是目前大多数Linux版本采用的默认Shell。

为什么我们的系统上合法的shell要写入/etc/shells这个文件?
这是因为系统某些服务在运行过程中,会去检查用户能够使用的shells,而这些shell的查询就是借由/etc/shells这个文件。

用户什么时候可以取得shell来工作?还有我这个默认会取得哪一个shell?
当我登录的时候,系统就会给我shell让我来工作,而这个登录取得的shell就记录在/etc/passwd这个文件内。

不同的shell具备不同的功能,shell还决定了Linux中默认的shell是/bin/bash,流行的shell有ash、bash、ksh、csh、zsh等,不同的shell都有自己的特点以及用途
目前大多数linux系统默认使用的是bash shell,默认登陆shell是/bin/bash,可以查看/etc/passwd文件里注明
这个shell是针对用户而言的,可以查看/etc/passwd里面的最后的字段使用的是哪个shell,如果想要修改可以用chmod -s或者chsh -s来重新指定

三、shell脚本

shell脚本就是说我们把原来 linux 命令或语句放在一个文件中,然后通过这个程序文件去执行时,我们就说这个程序为 shell 脚本或 shell 程序;我们可以在脚本中输入一系统的命令以及相关的语法语句组合,比如变量,流程控制语句等,把他们有机结合起来就形成了一个功能强大的 shell 脚本

总结:将需要执行的命令保存到一个文件中,按照顺序执行,它不需要编译,它是解释型的

1、shell脚本用处

①自动化完成软件的安装部署,如安装部署LAMP架构服务
②自动化完成系统的管理,如批量添加用户
③自动化完成备份,如数据库定时备份
④自动化的分析处理,如网站访问量

2、shell脚本使用场景

在需要完成大量复杂、重复性的工作时,不需要在命令行重复执行命令,直接运行shell脚本即可,大大的节省了时间提高了效率

3、如何学习shell脚本

熟悉掌握各种linux命令
掌握脚本的标准格式
掌握脚本的基本语法

4、shell脚本的构成

第一行为“#!/bin/bash”,脚本申明(默认解释器):表示此行以下的代码语句是通过/bin/bash程序来执行。还有其他类型的解释器,
比如#!/usr/bin/python、#!/usr/bin/expect
注释信息:以“#”开头的语句表示为注释信息,被注释的语句在脚本运行时不会被执行
可执行语句:如echo命令,用于输出“ ”之间的字符串

下面开始编写脚本
例1

vim a.sh

#!/bin/bash
cd /home/
pwd
ls -lh

在这里插入图片描述
在这里插入图片描述

例2
#!/bin/bash
#this is my first shell-script.
cd /home
echo "查询当前位置: "
pwd
echo “查询其中以a开头的文件:”
ls -lh n*

在这里插入图片描述

在这里插入图片描述

5、创建 shell 程序的步骤:

第一步:创建一个包含命令和控制结构的文件。
第二步:修改这个文件的权限使它可以执行 # 使用 chmod +x
[root@node ~]# chmod +x a.sh
第三步:检测语法错误
第四步:执行
[root@node ~]# ./a.sh

6、shell脚本执行

shell 脚本的执行通常有以下几种方式
方法一:当前路径(决定路径与相对路径)下执行脚本(要有执行权限)
chmod +x a.sh
/root/a.sh 或者 ./a.sh (用的比较多)

方法二:sh 、bash脚本文件路径(这种方式可以不对脚本文件添加执行权限)
bash a.sh 或 sh a.sh (用的比较多)

方法三:source 脚本文件路劲(可以没有执行权限)
source a.sh

方法四:其他方法
sh < a.sh 或者 cat a.sh |sh(bash)

四、重定向与管道操作

1、重定向

类型设备文件文件描述编号默认设备
标准输入/dev/stdin0键盘
标准输出/dev/stdout1显示器
标准错误输出/dev/stderr2显示器

用户通过操作系统处理信息的过程中,包括以下几类交互设备文件

标准输入(STDIN):默认的设备是键盘,文件编号为 0,命令将从标准输入文件中读取在执行过程中需要的输入数据。

标准输出(STDOUT):默认的设备是显示器,文件编号为 1,命令将执行后的输出结果发送到标准输出文件。

标准错误(STDERR):默认的设备是显示器,文件编号为 2,命令将执行期间的各种错误信息发送到标准错误文件。

从键盘接收用户输入的各种命令字串、辅助控制信息,并将命令结果输出到屏幕上;
如果命令执行出错,也会将错误信息反馈到屏幕上。

1.1、重定向输出

类型操作符用途
重定向输入<从指定的文件读取数据,而不是从键盘输入
重定向输出>将输出结果保存到指定的文件(覆盖原有内容)
>>将输出结果追加到指定的文件尾部
标准错误输出2>将错误信息保存到指定的文件(覆盖原有内容)
2>>将错误信息追加到指定的文件中
混合输出&>将标准输出、标准错误的内容保存到同一个文件中

重定向输出指的是将命令的正常输出结果保存到指定的文件中,而不是直接显示在显示器的屏幕上。
重定向输出使用“>”或“>>”操作符号,分别用于覆盖或追加文件
若重定向输出的目标文件不存在,则会新建该文件,然后将前面命令的输出结果保存到该文件中;若目标文件已经存在,则将输出结果覆盖或追加到文件中。

> 意思是当原来文件中有内容的话,原来的内容会被覆盖掉
>> 意思是当原来文件中有内容的话,新加的内容会追加到里面而不会覆盖原来的内容

列1
cat suanshu.sh >suanshu.txt

#查看结果
cat suanshu.txt
在这里插入图片描述

列2
uname -r >> suanshu.txt

#查看结果
cat suanshu.txt

在这里插入图片描述

1.2、重定向输入

重定向输入指的是将命令中接收输入的途径由默认的键盘改为指定的文件,而不是等待 从键盘输入。重定向输入使用“<”操作符。 通过重定向输入可以使一些交互式操作过程能够通过读取文件来完成。例如,使用 passwd 命令为用户设置密码时,每次都必须根据提示输入两次密码字串,非常烦琐,若改 用重定向输入将可以省略交互式的过程,而自动完成密码设置(结合 passwd 命令的“–stdin” 选项来识别标准输入)。

例1
#添加初始密码串内容"123456" 123456
echo “123456” >gclpasswd.txt

#从pass.txt读入密码给paswd命令而不是等待用户从键盘输入123456
passwd --stdin gcl < gclpasswd.txt

在这里插入图片描述

例2:

[root@localhost ~]# cat gclpasswd.txt //以键盘为输入设备,这也是系统默认的
123456
[root@localhost ~]# cat <gclpasswd.txt //跟cat 1.txt 结果是一样的,但是这是以1.txt文件作为输入设备了
123456
在这里插入图片描述

默认情况下,cat 命令会接受标准输入设备(键盘)的输入,并显示到控制台,但如果用文件代替键盘作为输入设备,那么该命令会以指定的文件作为输入设备,并将文件中的内容读取并显示到控制台

[root@node ~]# cat <<0 //以0作为分界符,只要不输入0就会一直输入数据从而显示到屏幕
[root@node ~]# cat <<0

12
13
14
15
0
12
13
14
15

在这里插入图片描述

[root@localhost ~]# cat << 0 > a.txt //可以把输入重定向和输出重定向结合使用,把从屏幕输出的内容保存到文件
[root@node ~]# cat <<0 >y.txt

12
13
0
[root@node ~]# cat y.txt
12
13
[root@node ~]#

在这里插入图片描述

1.3、错误重定向

错误重定向指的是将执行命令过程中出现的错误信息(如选项或参数错误等)保存到指 定的文件,而不是直接显示在屏幕上。错误重定向使用“2>”操作符

2个作用:
在实际应用中,错误重定向可用来收集程序执行的错误信息,为排错提供依据
还可以将无关紧要的错误信息重定向到空文件/dev/null 中,以保持脚本输出的简洁

使用“2>”操作符时,会像使用“>”操作符一样覆盖目标文件的内容,若要追加内容而不是覆盖文件,则应改用“2>>”操作符

当命令输出的结果可能既包括标准输出(正常执行)信息,又包括错误输出信息时,可 以使用操作符“>”“2>”将两类输出信息分别保存到不同的文件,也可以使用“&>”操作符将两类 输出信息保存到同一个文件

/dev/null:把它看作"黑洞",所有写入它的内容都会永远丢失. 而尝试从它那儿读取内容则什么也读不到. 然 而 /dev/null 对命令行和脚本都非常的有用
echo kgc > /dev/null
cat /dev/null #什么信息也看不到

&>和>&符号
&表示等同于的意思
例1:把正确和错误的消息输入到相同的位置
1>&2 把标准输出重定向到标准错误
2>&1 把标准错误重定向到标准输出,

ls /tmp xxxx >1.txt 2>&1
或:
ls /tmp xxxx 2>2.txt 1>&2

例 1: 将错误显示的内容和正确显示的内容分开
[root@node ~]# ls /home
gcl node
[root@node ~]# ls /home/jiji
ls: 无法访问/home/jiji: 没有那个文件或目录
[root@node ~]# ls /home /jiji >3.txt
ls: 无法访问/jiji: 没有那个文件或目录
[root@node ~]# cat 3.txt
/home:
gcl
node
[root@node ~]# ls /home /jiji 2>4.txt
/home:
gcl node
[root@node ~]# cat 4.txt
ls: 无法访问/jiji: 没有那个文件或目录

ls: 无法访问 xxx: 没有那个文件或目录
注:使用 2> 操作符时,会像使用 > 一样覆盖目标文件的内容,若追加而不覆盖文件的内容即可使用 2>> 操作符

在这里插入图片描述

列2
tar jcf /nonedir/etc.tgz /etc/ 2> error.log
cat /error.log
在这里插入图片描述
在这里插入图片描述

例3,在编译源码包的自动化脚本中,若要忽略 make、make install 等操作过程信息,则可以将其定向到空文件/dev/null。

输出结果保存到/dev/null,会出现下方图片中安装程序不显示安装过程

#!/bin/bash # 自动编译安装 httpd 服务器的脚本
cd /usr/src/httpd-2.4.25/
./configure --prefix=/usr/local/httpd --enable-so &> /dev/null
make &> /dev/null
make install &> /dev/null #/dev/null等同于make install > /dev/null 2>&1

2、管道操作

管道(pipe)操作为不同命令之间的协同工作提供了一种机制,位于管道符号“|”左侧的命令输出的结果,将作为右侧命令的输入(处理对象),同一行命令中可以使用多个管道。
在 Shell 脚本应用中,管道操作通常用来过滤所需要的关键信息。
$bash 表 示 系 统 提 示 符 , 表示系统提示符, 表示此用户为普通用户,超级用户的提示符是#,
bash是shell的一种,是linux下最常用的一种shell
$bash的意思是执行一个子shell,此子shell为bash。

列1:

[root@node ~]# rpm -qa | grep dhcp

在这里插入图片描述

[root@node ~]# grep "^a" /etc/shadow | awk -F: '{print $1,$3}'

在这里插入图片描述

例2
[root@node ~]# df -h | grep “/$” | awk '{print KaTeX parse error: Expected 'EOF', got '}' at position 2: 5}̲' 5% [root@node…" | awk ‘{print $5}’
92G
在这里插入图片描述

五、shell变量及赋值

shell的变量

变量是用来临时保存数据的,并且该数据时可以变化的,任何一个语言都离不开变量,如果某个内容需要多次使用并且会重复出现,这样就可以使用变量了,如果需要修改直接修改变量就可以了
常见 Shell 变量的类型包括自定义变量、环境变量、只读变量、位置变量、预定义变量

1、自定义变量

1、变量的定义
Bash中的变量操作相对比较简单,不像其他高级编程语言(如C/C++、Java等)那么复杂。在定义一个新的变量时,一般不需要提前进行声明,而是直接指定变量名称并赋给初始值(内容)即可

格式:变量名=变量值

变量名:临时存放数据的地方
变量值:临时的可变化的数据

等号两边没有空格。变量名称需以字母或下划线开头,名称中不要包含特殊字符(如+、-、*、/、.、?、%、&、#等)

用echo查看和引用变量的值
通过在变量名称前添加前导符号“$”,可以引用一个变量的值,使用 echo 命令可以查看变量,可以在一条 echo 命令中同时查看多个变量值
列1

[root@node ~]# a=1
[root@node ~]# b=1
[root@node ~]# echo $a$b
[root@node ~]# c=6
[root@node ~]# echo $a $c

在这里插入图片描述

当变量名称容易和紧跟其后的其他字符相混淆时,需要添加大括号“{}”将其括起来,否则将无法确定正确的变量名称。对于未定义的变量,将显示为空值
举例说明
列2

{}引用变量

[root@node ~]# echo $a2.5
[root@node ~]# echo ${a}2.5
[root@node ~]# echo $c2.5
[root@node ~]# echo ${c}2.5

在这里插入图片描述

[root@node ~]# d=gcl
[root@node ~]# echo ${d} 今天特开心
gcl 今天特开心

在这里插入图片描述

echo选项
echo -n 表示不换行输出
使用echo -e输出转义字符,将转义后的内容输出到屏幕上
常用的转义字符如下:
\c 不换行输出,在”\c”后面不存在字符的情况下,作用相当于echo -n
\n 换行
\t 转义后表示插入tab,即制表符

注:\转义符,跟在\之后的特殊符号将失去特殊含义,变为普通字符。如$将输出“$”符号,而不当做是变 量引用

[root@node ~]# echo -n san
san[root@node ~]# echo -e san
[root@node ~]# echo \n san
[root@node ~]# echo -e "sange $a"
[root@node ~]# echo -e "sange \$a"

在这里插入图片描述

取消定义
unset 变量名
在这里插入图片描述

特殊操作
还有一些特殊的赋值操作,可以更灵活地为变量赋值,以便适用于各种复杂的管理任务

双引号(”)
双引号主要起界定字符串的作用,特别是当要赋值的内容中包含空格时,必须以双引号括起来;其他情况下双引号通常可以省略
1、当内容中有空格
在这里插入图片描述

2、当以变量的值进行赋值
[root@node ~]# d=1314
[root@node ~]# pp=“520$d”
[root@node ~]# echo $pp
5201314

在这里插入图片描述

单引号(‘)
当要赋值的内容中包含$、“、\ 等具有特殊含义的字符时,应使用单引号括起来。
在单引号的范围内,将无法引用其他变量的值,任何字符均作为普通字符看待。输入什么就显示什么
但赋值内容中包含单引号(‘)时,需使用\’符号进行转义,以免冲突。

[root@node ~]# d=1314
[root@node ~]# pp='520$d'
[root@node ~]# echo $pp
520$d

在这里插入图片描述

反撇号(`)
反撇号主要用于命令替换,允许将执行某个命令的屏幕输出结果赋值给变量。
反撇号括起来的范围内必须是能够执行的命令行,否则将会出错

[root@node opt]# ls -lh `which bash`
-rwxr-xr-x. 1 root root 942K 1031 2018 /usr/bin/bash
[root@node opt]# ls -lh `which ssh`
-rwxr-xr-x. 1 root root 761K 411 2018 /usr/bin/ssh
[root@node opt]# ls -lh `which sh`
lrwxrwxrwx. 1 root root 4 422 04:36 /usr/bin/sh -> bash

在这里插入图片描述

先通过 which bash 命令查找出 bash 命令的程序位置,然后根据查找结果列出文件属性
date +%Y-%m-%d

[root@node ~]# time=`date +%Y-%m-%d-%T`
[root@node ~]# echo $time

在这里插入图片描述

使用反撇号难以在一行命令中实现嵌套命令替换操作,这时可以改用 “$()”来代替反撇号操作,以解决嵌套的问题
[root@node ~]# rpm -qc $(rpm -qf $(which bash))
在这里插入图片描述

2、交互式定义变量

read 命令
除了上述赋值操作以外,还可以使用 Bash 的内置命令 read 来给变量赋值。
用来提示用户输入信息,从而实现简单的交互过程。执行时将从标准输入设备(键盘)读入 一行内容,并以空格为分隔符,将读入的各字段依次赋值给指定的变量(多余的内容赋值给 最后一个变量)。若指定的变量只有一个,则将整行内容赋值给此变量。

[root@node ~]# read test
124     //等待用户输入,把输入的值赋予test变量
[root@node ~]# echo $test
124

一般来说为了使交互式操作的界面更加友好,提高易用性,read 命令可以结合“-p”选项来设置提示信息,以便告知用户应该输入什么内容等相关事项

[root@node ~]# read -p"请输出你的功法名:" name
请输出你的功法名:星辰变      
[root@node ~]# echo $name
星辰变

在这里插入图片描述

交互式定义变量(read)

选项作用
-p提示用户的信息
-n定义字符数
-s不显示用户输入的内容,常用于输入密码 read -s -p “input your password:” pass
-t定义超时时间,超过多长时间没输自动退出

从文件读取内容赋值给变量

[root@node ~]# echo goucl >name.txt
[root@node ~]# cat name.txt 
goucl
[root@node ~]# read -p "input your name:" Name < name.txt
[root@node ~]# echo $Name
goucl

在这里插入图片描述

stty -echo //关闭屏幕回显,回车确定后输入的命令不显示
stty echo //开启屏幕回显
在这里插入图片描述

3、变量的作用范围

默认情况下,新定义的变量只在当前的 Shell 环境中有效,因此称为局部变量,当进入子程序或新的子 Shell 环境时,局部变量将无法再使用
[root@node ~]# b=2
[root@node ~]# echo $b
2
[root@node ~]# bash #进入子shell环境
[root@node ~]# echo $b

[root@node ~]#

在这里插入图片描述

export命令
为了使用户定义的变量在所有的子 Shell 环境中能够继续使用,减少重复设置工作,可以通过内部命令 export 将指定的变量导出为全局变量。用户可以同时指定多个变量名称作为参数(无须使用“$”符号),变量名之间以空格分隔

[root@node ~]# exit
exit
[root@node ~]# export name a
[root@node ~]# bash
[root@node ~]# echo $name $a
xlm 1

在这里插入图片描述

[root@node ~]# echo "$name $a"
xlm 1
[root@node ~]# export name a      #导出为全局变量
[root@node ~]# bash
[root@node ~]# echo "$name $a"    #子程序引用全局变量
xlm 1
[root@node ~]# exit
exit

在这里插入图片描述

使用 export 导出全局变量的同时,也可以为变量进行赋值,这样在新定义全局变量时就不需要提前进行赋值了
env查看用户当前环境变量
export ABC=123
再次env就能看到了
export -n ABC 取消定义的全局变量变成局部变量
在这里插入图片描述
在这里插入图片描述

4、数值变量的运算及特殊变量

整数值的运算主要通过内部命令 expr 进行,运算符与变量之间必须有至少一个空格。
运算内容: 加(+) 、 减(-) 、 乘(*) 、 除(/) 、 取余(%)
运算符号: s(())和 $[ ]
运算命令: expr 和 let
运算工具: bc (系统自带)

expr命令(不仅可以运算,还支持输出到屏幕)
常用的几种运算符如下所述。
+:加法运算。
-:减法运算。
:乘法运算,注意不能仅使用""符号,否则将被当成文件通配符。
/:除法运算。
%:求模运算,又称为取余运算,用来计算数值相除后的余数。
[ ] 和 []和[]和(())必须要和echo在一起用因为他只能运算无法输出结果

在这里插入图片描述
在这里插入图片描述

vim suanshu.sh

#!/bin/bash
#1.定义数字
read -p "CL说出一个数字:" num1
read -p "GCL说出一个数字:" num2
#2.定义执行
sum=`expr $num1 + $num2`
echo "总和:"
echo $sum

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
进入Linux计算器
在这里插入图片描述
用计算器输出,除不尽的保留小数4位
在这里插入图片描述

5、环境变量

环境变量指的是出于运行需要而由 Linux 系统提前创建的一类变量,主要用于设置用户的工作环境,包括用户宿主日录、命令查找路径、用户当前目录、登录终端等。

环境变量的值由Linux系统自动维护,会随着用户状态的改变而改变。使用 env 命令可以查看到当前工作环境下的环境变量,对于常见的一些环境变量应了解其各自的用途。

例如,变量 USER 表示用户名称,HOME 表示用户的宿主目录,LANG表示语言和字符集,PWD 表示当前所在的工作日录,PATH 表示命令搜索路径等、RANDOM 表示随机数,会返回 0-32767 的整数,USER 表示当前账户的账户名称等,一般都用全大写定义,注意和自定义变量区分
[root@node ~]# echo $HOME
[root@node ~]# echo $USER
[root@node ~]# echo $PWD
[root@node ~]# echo $LANG
[root@node ~]# echo $SHELL
[root@node ~]# echo $RANDOM
[root@node ~]# echo $PATH

在这里插入图片描述

[root@node ~]# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
[root@node ~]# PATH="$PATH:/root"   # 临时设置
[root@node ~]# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/root   # 需要输入全路径,不然会导所有的命令无法使用

[root@node ~]# vim /etc/profile     #永久设置

末行添加
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/root
在这里插入图片描述

6、只读变量

shell变量中有一种特殊情况,一经设定,其值是不可改变的,这种变量被称为只读变量。在创建变量的时候可将其设置为只读属性,也可以将已存在的变最设置为只读属性,
只读变量主要用于变量值不允许被修改的情况
只读变量不可以改变值也不可以被删除

[root@node ~]# name=chailin
[root@node ~]# name=xulaingming
[root@node ~]# readonly name
[root@node ~]# echo $name
xulaingming
[root@node ~]# name=chailin
[root@node ~]# unset name
-bash: unset: name: 无法反设定: 只读 variable
在这里插入图片描述

7、位置变量

当执行命令行操作时,第一个字段表示命令名或脚本程序名,其余的字符串参数按照从左到右的顺序依次赋值给位置变量。

vim d.sh

#!/bin/bash
useradd $1
echo $2 | passwd --stdin $1

在这里插入图片描述

[root@node ~]# vim d.sh
[root@node ~]# sh d.sh gcl 123456
useradd:用户“gcl”已存在
更改用户 gcl 的密码 。
passwd:所有的身份验证令牌已经成功更新。
[root@node ~]# sh d.sh xxx 123456
更改用户 xxx 的密码 。
passwd:所有的身份验证令牌已经成功更新。

在这里插入图片描述

#!/bin/bash
sum=expr $1 + $2
echo “求和是:$sum”
在这里插入图片描述

[root@node ~]# vim e.sh
[root@node ~]# sh e.sh 33 55
在这里插入图片描述
2、命令或脚本本身的名称使用"$0"表示

8、预定义变量

预定义变量是由Bash程序预先定义好的一类特殊变量,用户只能使用预定义变量,而不能创建新的预定义变量,也不能直接为预定义变量赋值。预定义变量使用"$"符号和另一个符号组合表示
$#: 表示命令行中位置参数的个数。
$*: 表示所有位置参数的内容,这些内容当做一个整体
$@: 表示列出所有位置参数,但是是以单个的形式的列出
$?: 表示前一条命令执行后的返回状态,返回值为0表示执行正确,返回任何非0值均表示执行出现异常。
$0: 表示当前执行的脚本或程序的名称
$$: 表示返回当前进程的进程号
$!: 返回最后一个后台进程的进程号

例1:
[root@node ~]# a=3
[root@node ~]# echo $?
0
[root@node ~]# 2a=4
bash: 2a=4: 未找到命令…
[root@node ~]# echo $?
127
[root@node ~]# ya=4
[root@node ~]#
在这里插入图片描述
例2:

vim f.sh
#!/ bin/ bashecho $1
echo “ 0 表 示 当 前 执 行 的 脚 本 或 程 序 的 名 称 " e c h o " 0表示当前执行的脚本或程序的名称" echo " 0"echo"#表示命令行中未知参数的个数”
echo “ ∗ 所 有 位 置 参 数 的 内 容 , 这 些 内 容 当 做 一 个 整 体 " e c h o " *所有位置参数的内容,这些内容当做一个整体" echo " "echo"@表示列出所有参数位置,但是是以单个的形式的列出”
在这里插入图片描述
[root@node ~]# sh f.sh 2
在这里插入图片描述
例3:
[root@node ~]# vim f.sh
[root@node ~]# touch /home/gcl.txt &
[root@node ~]# echo $$
[root@node ~]# echo $!

[root@node ~]# ps -aux
[root@node ~]# echo $!

在这里插入图片描述
在这里插入图片描述
例4:

[root@node ~]# vim g.sh

#!/bin/bash
for i in “$*”
do
echo “this is nember: $i”
done

[root@node ~]# sh g.sh 1 2 3 4 5 6 7
在这里插入图片描述
在这里插入图片描述


[root@node ~]# vim h.sh

#!/bin/bash
for i in “$@”

do
echo “$i”
done

[root@node ~]# sh h.sh 1 2 3 4 5 6 7
在这里插入图片描述

在这里插入图片描述

例③

[root@node ~]# vim j.sh

#!/bin/bash
for var in “ ∗ " d o e c h o " *" do echo " "doecho"var”
done
for i in “ @ " d o e c h o " @" do echo " @"doecho"i”
done

[root@node ~]# sh j.sh 1 2 3 4 5 6 7
在这里插入图片描述

在这里插入图片描述

六、总结

1、shell的作用与应用场景
2、shell脚本的编写规范与执行方法
3、重定向与管道的作用和使用方法
4、自定义变量赋值时单引号、双引号、反撇号的使用方法
5、数值变量的常用运算符:+、-、*、/、%(取余)
6、环境变量、只读变量、位置变量、预定义变量的用途

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值