shell脚本编程规范与变量

772 阅读4分钟

1、shell概述

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

2、shell脚本的构成

1. 脚本申明(解释器):第一行开头“#!/bin/bash”,表示此行以下的代码语句是通过/bin/bash程序来解释执行。#!/bin/bash为默认的解释器还有其他类型的解释器,#!/bin/python      #!/bin/expect

2. 注释信息:以#开头的语句表示为注释信息

3. 可执行语句:比如echo命令用于输出“    ”之间的字符串

3、如何调用写好的脚本?

source 和  .   会在当前 shell 环境中执行脚本 bash  sh  绝对路径  相对路径 执行的脚本  会创建一个子shell环境,并在这个子shell环境中执行这个脚本

4、重定向 详解

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

交互式硬件设备

  • 标准输入:从该设备接收用户输入的数据
  • 标准输出:通过该设备向用户输出数据
  • 标准错误:通过该设备报告执行出错信息

重定向的意思就是 ,不通过标准输出到屏幕上,输出到你指定的位置

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

ls -lh > log.txt 2>&1

ls -lh  标准输出  1 -- > 屏幕

> log.txt   1 --> log.txt

2>&1        2 --> 1   , 1 指向 log.txt ,所以 2 也就指向了 log.txt

`...`  等同于  $(...)
[root@test1 ~]# vim passwd.txt\\重定向输入
123321
[root@test1 ~]# setenforce 0     \\关闭selinux否则会有问题
[root@test1 ~]# passwd --stdin lisi < passwd.txt 
#输入重定向
更改用户 lisi 的密码 。
passwd:所有的身份验证令牌已经成功更新。
[root@test1 ~]# cat passwd.txt 
123321
[root@test1 ~]# echo "123123" > passwd.txt     //单个覆盖,多个不覆盖追加
[root@test1 ~]# cat passwd.txt 
123123

## 多行重定向
[root@localhost ~]#cat > ky15.txt
#需要回车才会写入
hhh
111
ky15


[root@localhost ~]#cat >file.txt <<EOF               
111
222
333
444
EOF
[root@localhost ~]#cat file.txt 
111
222

333

444


5、变量的详解

5.1、常见shell变量的类型包括:

自定义变量:由用户自己定义,修改和使用*

环境变量:由系统维护,用于设置工作环境 可以用env命令查看*

只读变量:只可以读取不可以更改*

位置变量:通过命令行给脚本传递参数*

预定义变量:Bash中内置的一类变量,不能修改    有些规定好的变量 放在那里让你使用*

5.1.1、位置变量

位置变量也称为位置参数,使用" $1、$2、$3、…$9" 表示

./first.sh one two three four five  ......   10 ....  20

 $0    $1   $2   $3    $4    $5     ${10}   ${20}

图片1.jpg

5.1.2 预定义变量

是由Bash程序预先定义好的一类特殊变量,可以直接去使用,但是不能创建新的预定义变量,也不可以直接为预定义变量赋值

$0   代表脚本本身

$#   代表脚本后面跟的参数(位置变量)的个数

$*   不加双引号的话 $* 和 $@都代表脚本后面跟的所有参数,加上双引号 "$*" 会把所有参数当做一个整体的参数(此时参数数量为1)去看待

$@   加上双引号 "$@"  会把脚本后面跟的每一个参数当做一个个体去看待

$?   代表上一条命令或者脚本执行后返回的状态码,返回值为0表示执行正确,为非0值表示执行异常

5.2变量的命名要求

- 区分大小写

- 只能使用数字、字母及下划线,且不能以数字开头,注意:不支持短横线 “ - ”,和主机名相反

- 不要使用内置的变量,使用英文尽量使用词义通俗易懂,PATH - 大驼峰 StudentFirstName

- 小驼峰 studentFirstName

- 下划线 student_name

5.3定义变量的方法

方法1: 变量名=变量值

方法2:

read 变量名     从键盘输入中获取变量名的值

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

echo -n "提示 信息 "

read 变量名

5.4变量的作用范围

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

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

/etc/profile   /etc/bashrc   /root/.bash_profile   /root/.bashrc

1. 系统每次启动都会自动执行 /etc/profile 文件里的命令,这个文件是对全局有效的(所有的shell环境和用户)

2. 不同用户登录系统 会自动执行 自己家目录中的 ~/.bash_profile 文件中的命令,自动执行 ~/.bashrc

3. ~/.bashrc 当前用户每切换一个shell环境都会自动执行,执行  /etc/bashrc

4. /etc/bashrc  针对所有用户的,用户每切换一个shell环境都会自动执行

5.5变量赋值时特殊符号

1. 赋值时使用双引号(" ")可以直接调用变量

2. 赋值时使用单引号(' ')$只会被认为是字符$ 不会调用变量

3. 赋值时使用(``反撇在tab上面)命令替换,提取命令执行后的输出结果 。与 $( ) 用法相同

4. {}可以分隔变量值

5.6 shell的整数运算

shell默认只支持整数的运算

运算符:

加法 +

减法 -

乘法 *

除法 /

取余 (取模)%

常用的运算表达式如下

i=$(expr 12 * 5)

i=$((12*5))

i=$[12*5]

let i=12*5

let i++   i=$[$i+1]

let i--   i=$[$i-1]

let i+=2  i=$[$i+2]

let i/=2  i=$[$i/2]

6、管道符: |

 管道符  |

将左侧的命令输出结果,作为右侧命令的输入(处理对象)可以 叠加使用

[root@localhost opt]# ls /opt |wc
      2       2      12

修改密码
[root@localhost opt]# echo "123123" |passwd --stdin zhangsan
更改用户 zhangsan 的密码 。
passwd:所有的身份验证令牌已经成功更新

[root@test1 ~]# grep "/bin/bash$" /etc/passwd
root:x:0:0:root:/root:/bin/bash
zhangsan:x:1000:1000:zhangsan:/home/zhangsan:/bin/bash
lisi:x:1001:1001::/home/lisi:/bin/bash
[root@test1 ~]# grep "/bin/bash$" /etc/passwd | awk -F: '{print $1,$7}'
root /bin/bash
zhangsan /bin/bash
lisi /bin/bash