【LinuxShell】Shell编程规范与变量


前言

  什么是Shell?就是与内核沟通的界面、应用程序等等。比如你要播放音乐,你的计算机通过你再shell输入的打开音乐的命令,shell在告诉操作系统的内核用户希望打开音乐,内核在通过CPU调度、内存管理、磁盘输入输出等工作,将硬件调动,这时硬件声卡才会工作,硬件才是实际的工作者。

一、Shell脚本概述

1.Shell的概念

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

  用户想要使用shell就需要与内核进行交互。计算机接收用户所输入的的命令,然后shell会将所接收到的命令转换成计算机所能识别的二进制语言,再将命令传递给系统内核执行。

  Shell脚本其实就是将要执行的命令按顺序保存到一个文本文件,然后给该文件可执行权限,最后结合各种Shell控制语句运行文本文件以完成更复杂的操作。

2.Shell脚本应用场景

  • 在Shell脚本文件中使用for循环可以执行重复性操作。例如创建大量文件等等。

  • Shell脚本可以创建交互性任务实现免交互功能。例如:修改密码、su命令切换用户、ssh连接、sudo执行、fdisk磁盘创建等等。

  • 在Shell脚本文件中写入部署命令,然后赋予文件执行权限,就可以批量事务处理实现一键部署。例如搭建DNS服务、搭建PXE服务。

  • 通过编写Shell脚本的数据进行服务运行状态监控。例如查看内存、CPU、负载、网卡、io性能等等。

  • 通过Shell脚本定时任务执行。例如分时日月周应用等等。

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

3.Shell的作用

  Linux系统中的shell是一个特殊的应用程序,它介于操作系统内核与用户之间,充当了一个"翻译官"的角色,负责接收用户输入的操作指令命令并进行解释,将需要执行的操作传递给内核调动硬件执行,并输出执行结果。

在这里插入图片描述

  内核:用于调用计算机硬件资源。

  shell:将用户指令转换成计算机语言让内核去调用计算机硬件资源,bash为Linux默认的shell,文件位于/bin/bash

[root@host ~]# cat /etc/shells 						#查看shell类型
/bin/sh												#bash命令的软链接。已被/bin/bash所替换
/bin/bash											#基于GUN的框架下发展的shell
/usr/bin/sh											#已被bash所替代
/usr/bin/bash										#centos和redhat系统默认使用的bash shell
/bin/tcsh											#csh的增强版,与csh完全兼容,整合了csh,提供更多功能
/bin/csh											#已被/bin/bash所替换

4.计算机语言

  计算机根据面向方式不同分为面向对象的语言面向过程的语言,具体如下:

特征编程语言种类
面向对象Java、Python、C++、C#、go
面向过程C、shell

  计算机根据定义的类型方式不同分为强类型语言和弱类型语言,具体如下:

类型编程语言种类含义
强类型语言Java、C、C++、C#、go编译型语言,执行前需要先编译,运行速度快
弱类型语言Python、shell解释性语言,不需要编译即可直接执行,常用于作脚本

二、Shell编程规范

1.Shell脚本的构成

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

shell脚本具体格式如下:

[root@host opt]# vim first.sh
#!/bin/bash																#脚本申明
#desc:this is my first shell script.<tang 2023-04-25>					#注释信息

cd /boot																#执行语句内容
echo '当前所在目录为:'
pwd

echo '当前目录中以vm开头的文件有:'
ls -lh vm*

2.Shell脚本的执行

方法一:脚本文件路径 (绝对路径与相对路径)

  用绝对/相对路径指定脚本文件运行,需要执行用户拥有执行权限x,脚本会在子shell环境中运行

[root@host opt]# ll										#查看脚本文件权限
总用量 4
-rw-r--r--. 1 root root 169 4月  25 09:43 first.sh
[root@host opt]# chmod +x first.sh 						#给脚本执行权限
[root@host opt]# ll										#查看脚本文件权限
总用量 4
-rwxr-xr-x. 1 root root 169 4月  25 09:43 first.sh
[root@host opt]# /opt/first.sh 							#绝对路径执行脚本文件
当前所在目录为:
/boot
当前目录中以vm开头的文件有:
-rwxr-xr-x. 1 root root 6.5M 3月  22 19:50 vmlinuz-0-rescue-62002d65633644949ab3b96743d6820c
-rwxr-xr-x. 1 root root 6.5M 10月 20 2020 vmlinuz-3.10.0-1160.el7.x86_64
[root@host opt]# ./first.sh 							#相对路径执行脚本文件
当前所在目录为:
/boot
当前目录中以vm开头的文件有:
-rwxr-xr-x. 1 root root 6.5M 3月  22 19:50 vmlinuz-0-rescue-62002d65633644949ab3b96743d6820c
-rwxr-xr-x. 1 root root 6.5M 10月 20 2020 vmlinuz-3.10.0-1160.el7.x86_64

方法二:bash/sh 脚本文件路径

  用bash/sh程序指定脚本文件运行,不需要执行权限,脚本会在子shell环境中运行

[root@host opt]# bash first.sh 							#bash执行脚本文件
当前所在目录为:
/boot
当前目录中以vm开头的文件有:
-rwxr-xr-x. 1 root root 6.5M 3月  22 19:50 vmlinuz-0-rescue-62002d65633644949ab3b96743d6820c
-rwxr-xr-x. 1 root root 6.5M 10月 20 2020 vmlinuz-3.10.0-1160.el7.x86_64
[root@host opt]# sh first.sh 							#bash执行脚本文件
当前所在目录为:
/boot
当前目录中以vm开头的文件有:
-rwxr-xr-x. 1 root root 6.5M 3月  22 19:50 vmlinuz-0-rescue-62002d65633644949ab3b96743d6820c
-rwxr-xr-x. 1 root root 6.5M 10月 20 2020 vmlinuz-3.10.0-1160.el7.x86_64

方法三: source/.脚本文件

  用source/.指定脚本文件运行,脚本会在当前shell环境中运行(会影响当前所在目录、变量的值等因素)

[root@host opt]# . first.sh 							#.执行脚本文件
当前所在目录为:
/boot
当前目录中以vm开头的文件有:
-rwxr-xr-x. 1 root root 6.5M 3月  22 19:50 vmlinuz-0-rescue-62002d65633644949ab3b96743d6820c
-rwxr-xr-x. 1 root root 6.5M 10月 20 2020 vmlinuz-3.10.0-1160.el7.x86_64
[root@host boot]# pwd									#查看当前目录为/boot目录
/boot
[root@host boot]# cd -
/opt
[root@host opt]# source first.sh 						#source执行脚本文件
当前所在目录为:
/boot
当前目录中以vm开头的文件有:
-rwxr-xr-x. 1 root root 6.5M 3月  22 19:50 vmlinuz-0-rescue-62002d65633644949ab3b96743d6820c
-rwxr-xr-x. 1 root root 6.5M 10月 20 2020 vmlinuz-3.10.0-1160.el7.x86_64
[root@host boot]# pwd									#查看当前目录为/boot目录
/boot

三、重定向与管道操作

1.交互式硬件设备

  • 标准输入:从该设备接收用户输入的数据
  • 标准输出:通过该设备向用户输出数据
  • 标准错误:通过该设备报告执行出错信息
类型设备文件文件描述编号默认设备
标准输入/dev/stdin0键盘
标准输出/dev/stdout1显示器
标准错误输出/dev/stderr2显示器

2.重定向操作

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

重定向输入

[root@host boot]# echo 123456 | passwd --stdin test
更改用户test 的密码。
passwd:所有的身份验证令牌己经成功更新。
[root@host boot]# cd /opt/
[root@host opt]# vim pass.txt
[root@host opt]# cat pass.txt
123123
[root@host opt]# passwd --stdin test < pass.txt
更改用户test 的密码。
passwd:所有的身份验证令牌已经成功更新。

重定向输出

[root@host ~]# uname -p
x86_64
[root@host ~]# uname -p > ker.txt								#覆盖原有内容
[root@host ~]# cat ker.txt
x86_64
[root@host ~]# uname3.10.0-957.el7.x86 64	
[root@host ~]# uname -r >> ker.txt								#追加到指定文件尾部
[root@host ~]# cat ker.txt		
x86_64
3.10.0-957.el7

标准错误输出

[root@host ~]# cat a.txt
/etc/passwd
[root@host ~]# ls letc/passwd abc 2>a.txt/etc/passwd			#覆盖原有内容
[root@host ~]# cat a.txt
ls:无法访问abc:没有那个文件或目录
[root@host ~]# ls letc/passwd abc 2>>a.txt/etc/passwd			#追加到指定文件尾部
[root@host ~]# cat a.txt
ls:无法访问abc:没有那个文件或目录
ls:无法访问abc:没有那个文件或目录

混合输出

[root@host opt]# echo 123123 &> pass.txt				#输入正确的内容覆盖原有内容
[root@host opt]# cat pass.txt
123123
[root@host opt]# ech1323210 123123 &> pass.txt			#输入错误的内容覆盖原有内容
[root@host opt]# cat pass.txt
bash: ech1323210:未找到命令...
[root@host opt]# ech1323210 123123 &>> pass.txt			#追加到指定文件尾部
[root@host opt]# cat pass.txt
bash: ech1323210:未找到命令...
bash: ech1323210:未找到命令...
[root@host opt]# echo 123123 > pass.txt 2>&1			#输入错误的内容覆盖原有内容
[root@host opt]# cat pass.txt 
123123

3.管道符操作

  将管道符号"|"左侧的命令输出的结果,作为右侧命令的输入(处理对象),同一行命令中可以使用多个管道。

命令1 | 命令2 

有些命令不能直接执行,需要xages可以进行传递执行。

四、Shell变量

1.变量的作用

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

  变量名:使用固定的名称,由系统预设或用户定义

  变量值:能够根据用户设置、系统环境的变化而变化

2.变量的类型

  自定义变量:由用户自己定义、修改和使用;

  特殊变量:Linux系统事先定义的变量,分为环境变量、只读变量、位置变量、预定义变量。

3.自定义变量

  自定义变量是由系统用户自己定义的变量,只在用户自己的shell环境中有效,因此又称为本地变量。在编写shell脚本的时候,通常会设置一些特定的自定义变量。

定义一个新的变量

  变量名以字母或下划线开头,区分大小写,建议全大写,方便辨识。 其中=两边没有空格!

变量名=变量值

例如:

[root@host opt]# a=123
[root@host opt]# A=456
[root@host opt]# echo $a
123
[root@host opt]# echo $A
456
[root@host opt]# 123=abc
bash: 123=abc: 未找到命令...
[root@host opt]# abc123=abc
[root@host opt]# echo $abc123
abc
[root@host opt]# _123=cde
[root@host opt]# echo $_123
cde
[root@host opt]# name="zhang san"
[root@host opt]# echo $name
zhang san

查看定义的变量的值

基本格式:

echo $变量名

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

使用方法:

基本用法。例如:

[root@host opt]# name=zhangsan
[root@host opt]# echo $name 
zhangsan

可以同时输出两个变量的值。例如:

[root@host opt]# a=123
[root@host opt]# A=456
[root@host opt]# echo $a $A
123 456
[root@host opt]# echo $a$A
123456

可以在变量名两边可以加{}使用,若不括起来,系统会将数值和变量都看一整个变量,无法识别。例如:

[root@host opt]# a=123
[root@host opt]# echo ${a}456
123456

可以在多个变量之间使用特殊符号,特殊符号会被看做分隔符。例如:

[root@host opt]# a=123
[root@host opt]# A=456
[root@host opt]# echo $a.$A
123.456

变量赋值的特殊操作

双引号:允许通过 $ 符号引用其他变量值,将$当作特殊符号。

[root@host opt]# a=123
[root@host opt]# echo "$a" 
123

单引号:禁止引用其他变量值,会把 $ 等特殊符号视为普通字符去使用。

[root@host opt]# echo '$a'
$a

反撇号:命令替换,获取里面的命令执行后的输出结果。ldd和echo效果一样。

[root@host opt]# which mkdir
/usr/bin/mkdir
[root@host opt]# echo `which mkdir`
/usr/bin/mkdir
[root@host opt]# ldd `which mkdir`
	linux-vdso.so.1 =>  (0x00007ffd3395f000)
	libselinux.so.1 => /lib64/libselinux.so.1 (0x00007feb2837d000)
	libc.so.6 => /lib64/libc.so.6 (0x00007feb27faf000)
	libpcre.so.1 => /lib64/libpcre.so.1 (0x00007feb27d4d000)
	libdl.so.2 => /lib64/libdl.so.2 (0x00007feb27b49000)
	/lib64/ld-linux-x86-64.so.2 (0x00007feb285a4000)
	libpthread.so.0 => /lib64/libpthread.so.0 (0x00007feb2792d000)

$():命令替换,获取里面的命令执行后的输出结果。ldd和echo效果一样。

[root@host opt]# echo $(which mkdir)
/usr/bin/mkdir
[root@host opt]# ldd $(which mkdir)
	linux-vdso.so.1 =>  (0x00007fffadbf9000)
	libselinux.so.1 => /lib64/libselinux.so.1 (0x00007fad75d9a000)
	libc.so.6 => /lib64/libc.so.6 (0x00007fad759cc000)
	libpcre.so.1 => /lib64/libpcre.so.1 (0x00007fad7576a000)
	libdl.so.2 => /lib64/libdl.so.2 (0x00007fad75566000)
	/lib64/ld-linux-x86-64.so.2 (0x00007fad75fc1000)
	libpthread.so.0 => /lib64/libpthread.so.0 (0x00007fad7534a000)

内容交互式定义变量(read)

  read命令获取从键盘输入内容为变量值

read [-p "提示信息"] 变量名

例如:

[root@host opt]# vim second.sh 								#编写一个脚本
#!/bin/bash
name='zhangsan'
read -p " 请输入name变量的值" name	
echo "当前name变量的值为:$name"
[root@host opt]# ./second.sh 
 请输入name变量的值lisi										#从键盘输入lisi,系统会将lisi赋给name
当前name变量的值为:lisi										#此时在输出name的值就是lisi

设置变量的作用范围

  默认定义的变量是一个局域变量,只适合当前shell环境有效。如果想要在所有shell环境生效,需要用到export命令。

格式1:变量名=变量值
	  export 变量名...
格式2:export 变量名=变量值

两种方式可以混合使用

[root@host opt]# name=zhangsan
[root@host opt]# echo $name
zhangsan
[root@host opt]# export name
[root@host opt]# bash
[root@host opt]# echo $name
zhangsan

  export命令输出的变量是临时变量,关机重启后会失效。若想要设置永久生效,可以在 /etc/profile文件添加export命令定义。如果不想重启后再生效,可以执行source命令,source会使文件立即再当前环境执行。

[root@host opt]# vim /etc/profile
export name='wangwu'
[root@host opt]# source /etc/profile
[root@host opt]# echo $name								#当前环境引用的全局变量
wangwu
[root@host opt]# bash
[root@host opt]# bash
[root@host opt]# bash
[root@host opt]# echo $name								#子环境引用的全局变量
wangwu

整数变量的运算

  Shell变量的数值运算多用于脚本程序的过程控制。在Bash Shell环境中,只能进行简单的整数运算,不支持小数运算。整数值的运算主要通过内部命令expr进行,基本格式如下所示。需要注意的是,运算符与变量之间必须有至少一个空格

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

    运算符号(())[],其中[](())效果一致

    运算命令exprlet

expr命令

  expr命令是一个手工命令行计数器,用于在UNIX/LINUX下求表达式变量的值,一般用于整数值,也可用于字符串。

运算格式

expr 变量1 运算符 变量2 [运算符 变量3]..

基本运算方式

[root@host ~]# expr 123 + 123					#加法运算
246
[root@host ~]# expr 246 - 123					#减法运算
123
[root@host ~]# expr 5 * 5						#这里要加反斜杠
expr:语法错误
[root@host ~]# expr 5 \* 5						#乘法的多种格式
25	
[root@host ~]# expr 5 "*" 5						#乘法的多种格式
25
[root@host ~]# expr 5 '*' 5						#乘法的多种格式
25
[root@host ~]# expr 10 / 2						#除法运算
5
[root@host ~]# expr 10 % 3						#取余运算
1

变量运算方式

[root@host ~]# a=22								#定义a的值
[root@host ~]# b=11								#定义b的值
[root@host ~]# expr $a + $b						#计算变量a+变量b的值
33
[root@host ~]# expr $a - $b						#计算变量a-变量b的值
11
[root@host ~]# expr $a \* $b					#计算变量a×变量b的值
242
[root@host ~]# expr $a / $b						#计算变量a÷变量b的值
2
[root@host ~]# expr $a % $b						#计算变量a%变量b的值
0
[root@host ~]# echo $((10 + 3))					#计算10+3的值
13
[root@host ~]# echo $((10 - 3))					#计算10-3的值
7
[root@host ~]# echo $((10 * 3))					#计算10×3的值
30
[root@host ~]# echo $((10 / 3))					#计算10÷3的值
3
[root@host ~]# echo $((10 % 3))					#计算10%3的值
1
let命令

  let 命令是 BASH 中用于计算的工具,用于执行一个或多个表达式,变量计算中不需要加上 $ 来表示变量。如果表达式中包含了空格或其他特殊字符,则必须引起来。

let n++        #n自加1
let n--        #n自减1
let n+=数字	  #n+数字

其中n++是先输出后执行,++n是先执行后输出。

基本运算方式

[root@host ~]# let i=10*3
[root@host ~]# echo $i
30
[root@host ~]# let i=10/3
[root@host ~]#  echo $i
3
[root@host ~]# let i=10-3
[root@host ~]# echo $i
7
[root@host ~]# let i=10%3
[root@host ~]# echo $i
1   

其他运算方式

[root@host ~]# i=1
[root@host ~]# let i++
[root@host ~]# echo $i
2
[root@host ~]# let ++i
[root@host ~]# echo $i
3

[root@host ~]# i=5
[root@host ~]# let i+=5
[root@host ~]# echo $i
10
[root@host ~]# let i-=5
[root@host ~]# echo $i
5
[root@host ~]# i=2
[root@host ~]# let i*=2
[root@host ~]# echo $i
4
[root@host ~]# let i/=2
[root@host ~]# echo $i
2

五、特殊的Shell变量

1.环境变量

  • 由系统提前创建,用来设置用户的工作环境
  • 配置文件:/etc/profile(全局配置文件) 、~/.bash_profile(用户的独立配置文件)

2.常见的环境变量

名称作用
PWD查看当前所在目录
PATH查看系统命令搜索路径
USER查看当前登录用户
HOME查看当前登录用户的家目录
SHELL查看当前登录用户的shell环境
LANG查看当前系统的语言和字符集编码
HISTSIZE查看历史命令条数

基本使用方法

[root@host sysconfig]# pwd
/etc/sysconfig
[root@host sysconfig]# echo $PWD				#查看当前所在目录
/etc/sysconfig
[root@host sysconfig]# echo $PATH				#查看系统命令搜索路径
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
[root@host sysconfig]# echo $USER				#查看当前登录用户
root
[root@host sysconfig]# echo $HOME				#查看当前登录用户的家目录
/root
[root@host sysconfig]# echo $SHELL				#查看当前登录用户的shell环境
/bin/bash
[root@host sysconfig]# echo $LANG				#查看当前系统的语言和字符集编码
zh_CN.UTF-8

系统能够自动设别到脚本文件并执行,需要将文件加入到PATH环境变量中

方法1:创建软连接指向PATH环境变量的目录中

[root@host opt]# ls	
first.sh  second.sh
[root@host opt]# ln -s /opt/* /usr/local/bin/			#做一个软链接
[root@host opt]# ls /usr/local/bin/						#查看软链接是否创建成功
first.sh  second.sh 
[root@host opt]# echo $PATH								#查看是否添加环境变量成功
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/opt
[root@host opt]# first.sh 								#此刻可以直接执行脚本文件
当前所在目录为:
/boot
当前目录中以vm开头的文件有:
-rwxr-xr-x. 1 root root 6.5M 3月  22 19:50 vmlinuz-0-rescue-62002d65633644949ab3b96743d6820c
-rwxr-xr-x. 1 root root 6.5M 10月 20 2020 vmlinuz-3.10.0-1160.el7.x86_64
[root@host opt]# second.sh 								#此刻可以直接执行脚本文件
 请输入name变量的值zhangsan
当前name变量的值为:zhangsan

方法2:创建新的PATH环境变量,编辑/etc/profile 全局环境变量

[root@host opt]# vim /etc/profile						#添加PATH环境变量
export PATH=$PATH:/opt
[root@host opt]# source /etc/profile					#加载全局配置文件
[root@host opt]# echo $PATH								#查看是否添加环境变量成功
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/opt
[root@host opt]# cd
[root@host ~]# first.sh 								#此刻可以直接执行脚本文件
当前所在目录为:
/boot
当前目录中以vm开头的文件有:
-rwxr-xr-x. 1 root root 6.5M 3月  22 19:50 vmlinuz-0-rescue-62002d65633644949ab3b96743d6820c
-rwxr-xr-x. 1 root root 6.5M 10月 20 2020 vmlinuz-3.10.0-1160.el7.x86_64

3.只读变量

  用于变量值不允许被修改的情况,只能重启才可以取消设置。

[root@host opt]# name=zhangsan					#定义name为zhangsan
[root@host opt]# readonly name					#设置为只读变量
[root@host opt]# echo $name
zhangsan
[root@host opt]# name=lisi		
-bash: name: 只读变量							#只读变量不可以被重新赋值
[root@host opt]# unset name						
-bash: unset: name: 无法反设定: 只读 variable	  #只读变量不可以被删除

4.位置变量

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

  $nn为数字,$0代表命令本身,$1-$9代表第一个到第九个参数,十以上的参数需要使用{n}表示,比如第十个参数为${10}

[root@host opt]# vim third.sh                                                                           
#!/bin/bash

echo $0
echo $1
echo $2
echo $3
echo $4
echo $5
echo $6
echo $7
echo $8
echo $9
echo $10
[root@host opt]# chmod +x third.sh 
[root@host opt]# ./third.sh 1 2 3 4 5 6 7 8 9 10
./third.sh												#输出脚本文件本身
1														#输出第一个位置参数
2														#输出第二个位置参数
3														#输出第三个位置参数
4														#输出第四个位置参数
5														#输出第五个位置参数
6														#输出第六个位置参数身
7														#输出第七个位置参数
8														#输出第八个位置参数
9														#输出第九个位置参数
10														#输出第一个位置参数加上0

5.预定义变量

常见的预定义变量有以下几种:

  $*$@:表示命令或脚本要处理的参数。

  $0:表示当前执行的脚本或命令的名称。

  $#:表示命令或脚本要处理的参数的个数。

  $?:表示前一条命令或脚本执行后的返回状态码,返回值为0表示执行正确,返回任何非0值均表示执行出现异常。也常被用于Shell脚本中return退出函数并返回的退出值。

其中$*$@如果加上引号,含义就不一样了:

  • $*:把所有参数看成以空格分隔的一个字符串整体(单字符串)返回,代表$1 &2 &3 &4
  • $@:把各个参数加上双引号分隔成n份的参数列表,每个参数作为一个字符串返回,代表$1&2&3&4

$*$@的用法

[root@host opt]# vim third.sh
echo "当前脚本有$#个参数"

echo "---没有双引号时---"
echo "$*输出为:"
for i in $*
do
 echo $i
done
            
echo "$@输出为:" 
for k in $@ 
do          
  echo $k  
done
              
      
echo "---有双引号时---"
echo "$*输出为:"
for n in "$*"
do  
 echo $n
done
    
echo "$@输出为:" 
for m in "$@" 
do
  echo $m
done
[root@host opt]# ./third.sh 1 2 3 4 5 6 7 8 9
当前脚本有9个参数
---没有双引号时---
1 2 3 4 5 6 7 8 9输出为:
1
2
3
4
5
6
7
8
9
1 2 3 4 5 6 7 8 9输出为:
1
2
3
4
5
6
7
8
9
---有双引号时---
1 2 3 4 5 6 7 8 9输出为:
1 2 3 4 5 6 7 8 9									# $* 看作一个整体
1 2 3 4 5 6 7 8 9输出为:
1													# $@ 看作多个独立个体
2
3
4
5
6
7
8
9

$? 的用法

[root@host opt]# ls
first.sh  second.sh  third.sh
[root@host opt]#echo $?
0									#当执行成功他会返回0
[root@host opt]# ls / xxXx
ls:无法访问/xxxx:没有那个文件或目录
[root@host opt]# echo $?
2									#当执行失败时他会返回—个非0值

六、总结

  1. Shell脚本的内容构成:环境声明、注释文字、执行语句
  2. 重定向包括重定向输入、重定向输出、错误重定向
  3. 定义或赋值变量时,采用“变量名=变量值”的格式
  4. 赋值操作还可以使用单引号、双引号、反撇号、read命令等方式
  5. 查看或引用变量的值时,采用“$变量名”的格式
  6. 常见的特殊变量包括环境变量、只读变量、位置变量、预定义变量
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我的宝贝大唐

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值