Shell编程规范与变量

Shell脚本概念

Shell脚本的概念

  • 将要执行的命令按顺序保存到一个文本文件
  • 给该文件可执行权限
  • 可结合各种Shell控制语句以完成更复杂的操作

Shell脚本应用场景

  • 重复性操作
  • 交互性任务
  • 批量事务处理
  • 服务运行状态监控
  • 定时任务执行
  • ……

编写Shell脚本

其中echo“…………”用于输出字符串,带有#的行是注释

#!/bin/bash为特殊脚本声明,表示此行后的语句以/bin/bash程序来解释执行

[root@localhost ~]$ vim aa.sh        #新建aa.sh文件
#!/bin/bash
cd /boot
#这是查看当前目录
echo "当前目录是:"        
pwd

echo "我有哪些文件:"
ls -l


Shell的作用——命令解释器,“翻译官”

介于系统内核与用户之间,负责解释命令行

Shell脚本的三种执行方式

指定解释器的方式        先打开一个子bash,执行脚本,再退出子bush
bash
sh

指定路径方式执行脚本,需要该文件有执行权

直接加载脚本                        在当前的bush程序

source

重定向与管道操作 

重定向

分为输出和输入,标准输出是屏幕,标准输入是键盘

重定向输出格式

命令 [选项 参数] > 文件    #将命令原本应输出到屏幕的内容输出到指定文件中

重定向输入格式

passwd --stdin 用户名 < passwd.txt    #将passwd.txt的内容输入到密码修改

错误重定向

命令 >error.log

管道操作

通常用来过滤所需要的关键信息 

[root@localhost ~]$ netstat -anpt | grep sshd
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      1155/sshd           
tcp        0     36 192.168.10.101:22       192.168.10.2:61795      ESTABLISHED 1410/sshd: root@pts 
tcp        0      0 192.168.10.101:22       192.168.10.2:61798      ESTABLISHED 1415/sshd: root@not 
tcp6       0      0 :::22                   :::*                    LISTEN      1155/sshd 
[root@localhost ~]$ netstat -anpt | grep sshd | awk -F: '{print $1}'
tcp        0      0 0.0.0.0
tcp        0     36 192.168.10.101
tcp        0      0 192.168.10.101
tcp6       0      0 

上例awk命令的作用是以":"作为分隔,输出第一个区域的字符串,其中-F用于指定分隔符合

变量

自定义变量

由系统用户自己定义的变量,只在用户自己的Shell环境中有效,也叫本地变量

定义新的变量

基本格式为“变量名=变量值”,例:

name=zhangsan

查看和引用变量的值

在变量名前加上引导符号“$”可以引用以恶搞变量的值,使用echo命令可以查看变量,一条echo命令可以查看多个变量

[root@localhost ~]$ echo $name
asda
[root@localhost ~]$ echo $name $USER
asda root

当变量名称容易与紧跟其后的其他字符混淆时,使用“{}”将其括起来,否则无法确定正确的变量名

[root@localhost ~]$ echo $name2.5
.5
[root@localhost ~]$ echo ${name}2.5
asda2.5

变量赋值的特殊操作

1.双引号(“)

当变量值 中有空格时可以使用双引号括起来,在双引号范围内,使用$符号可以引用其他变量的值

[root@localhost ~]$ conf=12 3
-bash: 3: 未找到命令
[root@localhost ~]$ conf="12 3"
[root@localhost ~]$ echo $conf
12 3


[root@localhost ~]$ conf="$name 123"
[root@localhost ~]$ echo $conf
zhang san 123

2.单引号(’)

当要赋值的内容中包含特殊含义字符时,使用单引号括起来,在单引号的范围内,特殊字符都会被当作普通字符看待,当赋值内容包含单引号时,需要用"\"进行转义

[root@localhost ~]$ conf='$name 123'
[root@localhost ~]$ echo $conf
$name 123

3.反撇号(`)

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

[root@localhost ~]$ ls -lh `which useradd`
-rwxr-xr-x. 1 root root 135K 8月   9 2019 /usr/sbin/useradd

当在同一命令需要进行嵌套操作时,需要把”`“切换为$()

[root@localhost ~]$ rpm -qc $(rpm -qf $(which useradd))
/etc/default/useradd
/etc/login.defs

4.read命令

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

[root@localhost ~]$ read sum
sadas
[root@localhost ~]$ echo $sum
sadas

-p选项可以设置在输入内容时的提示信息

[root@localhost ~]$ read -p "请输入" sum
请输入123
[root@localhost ~]$ echo $sum
123

设置变量的作用范围

默认情况下新定义的变量只在当前的Shell环境中有效,因此被称为局部变量。当进入其他Shell环境中时,局部变量无法再使用,这时可以使用export将变量导出为全局变量

[root@localhost ~]$ echo $sum
123
[root@localhost ~]$ bash
[root@localhost ~]$ echo $sum

[root@localhost ~]$ exit
exit
[root@localhost ~]$ export sum
[root@localhost ~]$ bash
[root@localhost ~]$ echo $sum
123
[root@localhost ~]$ 

export可以在创建变量时使用,可以在定义新的全局变量时,不需要提前赋值

[root@localhost ~]$ export name=zhangsan
[root@localhost ~]$ echo $name
zhangsan

数值变量的运算

在Bash Shell环境中只能进行简单的整数运算,不支持小数运算。通过expr命令进行,注意,运算符与变量之间至少有一个空格,格式如下

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

变量 1、变量 2……对应为需要计算的数值变量(需要以“$”符号调用)

常用运算符如下

  • +:加法运算。
  • -:减法运算。
  • \*:乘法运算,注意不能仅使用“*”符号,否则将被当成文件通配符。
  • /:除法运算。
  • %:求模运算,又称为取余运算,用来计算数值相除后的余数

下面是将x设为10,y设为5大各种运算结果

[root@localhost ~]$ expr $x + $y
15
[root@localhost ~]$ expr $x - $y
5
[root@localhost ~]$ expr $x \* $y
50
[root@localhost ~]$ expr $x / $y
2
[root@localhost ~]$ expr $x % $y
0

可以使用命令替换操作,将运算结果赋值给其他变量

特殊的Shell变量

1.环境变量

env列出当前系统的全局变量

其中的PATH 变量用于设置可执行程序的默认搜索路径,当仅指定文件名称来执行命令程序时,Linux 系统将在 PATH 变量指定的目录范围查找对应的可执行文件,如果找不到则会提示“command not found”

[root@localhost opt]$ aa.sh
bash: aa.sh: 没有那个文件或目录
[root@localhost opt]$ PATH="$PATH:/root"
[root@localhost opt]$ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/root
[root@localhost opt]$ aa.sh
当前目录是:
/boot
我有哪些文件:
总用量 153352
-rw-r--r--. 1 root root   153591 10月 20 2020 config-3.10.0-1160.el7.x86_64
-rw-r--r--. 1 root root   253882 4月  18 03:24 config-6.8.7-1.el7.elrepo.x86_64
drwxr-xr-x. 3 root root       17 4月  21 00:01 efi
drwxr-xr-x. 2 root root       27 4月  21 00:02 grub
drwx------. 5 root root       97 4月  21 17:22 grub2
-rw-------. 1 root root 62118007 4月  21 00:03 initramfs-0-rescue-1de09106fce64aed8e73ee0e85d7a95f.img
-rw-------. 1 root root 21598143 4月  21 00:05 initramfs-3.10.0-1160.el7.x86_64.img
-rw-------. 1 root root 13670281 4月  21 00:05 initramfs-3.10.0-1160.el7.x86_64kdump.img
-rw-------. 1 root root 23350088 4月  21 17:22 initramfs-6.8.7-1.el7.elrepo.x86_64.img
-rw-r--r--. 1 root root   320648 10月 20 2020 symvers-3.10.0-1160.el7.x86_64.gz
-rw-r--r--. 1 root root   340956 4月  18 03:25 symvers-6.8.7-1.el7.elrepo.x86_64.gz
-rw-------. 1 root root  3616707 10月 20 2020 System.map-3.10.0-1160.el7.x86_64
-rw-------. 1 root root  6825161 4月  18 03:24 System.map-6.8.7-1.el7.elrepo.x86_64
-rwxr-xr-x. 1 root root  6769256 4月  21 00:03 vmlinuz-0-rescue-1de09106fce64aed8e73ee0e85d7a95f
-rwxr-xr-x. 1 root root  6769256 10月 20 2020 vmlinuz-3.10.0-1160.el7.x86_64
-rwxr-xr-x. 1 root root 11224064 4月  18 03:24 vmlinuz-6.8.7-1.el7.elrepo.x86_64
[root@localhost opt]$

将变量设为永久,在/etc/profile的末尾加上export 变量名=变量值,若希望立即生效,应手动修改环境变 量,或者可以加载配置文件执行。

2.只读变量

使用 readonly 命令将变量定义为只读变量,定义之后不能通过再次赋值的方式进行修改。

[root@localhost opt]$ name=zhangsan
[root@localhost opt]$ readonly name        #设置为只读变量
[root@localhost opt]$ echo $name
zhangsan
[root@localhost opt]$ name=lisi
bash: name: 只读变量                        #只读变量无法被修改
[root@localhost opt]$ echo $name
zhangsan
[root@localhost opt]$ unset name        #只读变量无法被删除
bash: unset: name: 无法反设定: 只读 variable

3.位置变量

位置变量也称为位置参数,使用$1$2$3$9 表示。例如,当执行命令行“ls -lh

/boot/”时,其中第 1 个位置变量为“-lh”,以“$1”表示;第 2 个位置变量为“/boot/”,以“$2”

示。命令或脚本本身的名称使用“$0”表示,虽然$0 与位置变量的格式相同,但是$0 属于预

定义变量而不是位置变量。

[root@localhost ~]$ vim cc.sh
#!/bin/bash
SUM=`expr $1 + $2`
echo "$1 + $2 = $SUM"
[root@localhost ~]$ chmod +x cc.sh 
[root@localhost ~]$ ./cc.sh 10 20
10 + 20 = 30

4.预定义变量

预定义变量是由 Bash 程序预先定义好的一类特殊变量,用户只能使用预定义变量,而

不能创建新的预定义变量,也不能直接为预定义变量赋值。预定义变量使用“$”符号和另一

个符号组合表示,较常用的几个预定义变量的含义如下。

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

$*:表示所有位置参数的内容。

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

值均表示执行出现异常。关于$?变量的使用将在下一章介绍。

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

  • 27
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值