shell编程语言 -1

219 阅读3分钟

1、shell脚本基础

1.1 shell的作用

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

查看本机shell信息

[root@localhost ~]# cat /etc/shells

/bin/sh
/bin/bash
/sbin/nologin
/usr/bin/sh
/usr/bin/bash
/usr/sbin/nologin
/bin/tcsh
/bin/csh
[root@localhost ~]# 


1.3 脚本执行逻辑及执行方式

逻辑

1.顺序

2.选择

3.循环

执行方式

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

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

1.4 脚本错误调试

1.命令错误

2.语法错误

3.逻辑错误 -- (只能自己去检查)

4.查看代码是否正确

bash -n 脚本名称 -- 检查语法错误

bash -x 脚本名称 -- 逻辑错误 -- 将脚本所有的语句执行一遍

5.set -e

在脚本前输入set -e 一旦出错立即停止

2、重定向和管道符

2.1 重定向

意思:不输出到默认设备上,输出到你指定的地点上(文件 其他输出设备)

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

2.2 多行重定向

[root@localhost ~]# wc -l <<eof
> 123
> 35
> 45
> eof
3
[root@localhost ~]# 


[root@localhost ~]# cat > ky15.txt
hhh
111
ky15
q

[root@localhost ~]# cat ky15.txt 
hhh
111
ky15
q
[root@localhost ~]# 


通过此来实现将内容写入文件
[root@localhost ~]# cat >1.txt <<eof
> 123
> gfy
> 456
> eof
[root@localhost ~]# cat 1.txt 
123
gfy
456
[root@localhost ~]# 

2.3 管道符 |

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

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

3、变量

3.1 read -p 从键盘输入的内容变成变量

3.2 export 定义全局变量

如果没有exort 那么开启一个新的bash 将不会继承定义的变量

[root@localhost opt]# abc=123
[root@localhost opt]# echo $abc 
123
[root@localhost opt]# bash
[root@localhost opt]# echo $abc
为空
[root@localhost opt]# exit
exit
[root@localhost opt]# echo $abc
123
[root@localhost opt]# export abc
#export  变量名      定义全局变量
[root@localhost opt]# bash
[root@localhost opt]# echo $abc
123

4、条件语句

4.1 测试

test测试文件表达式 是否成立

格式1:test  条件表达式
格式2:[  条件表达式  ]
注意[]空格,否则会失败
测试 是否成功使用 $?  返回值
[ 操作符 文件或目录 ]
help test

操作符

-d : 测试是否为目录

-e : 测试目录或文件是否存在

-f : 测试是否为文件

-r : 测试当前用户是否有权限读取

-w : 测试当前用户是否有权限写入

-x : 测试当前用户是否有权限执行

-L : 测试文件是否为软连接文件


属性测试补充:

-s FILE #是否存在且非空
-t fd #fd 文件描述符是否在某终端已经打开
-N FILE #文件自从上一次被读取之后是否被修改过
-O FILE #当前有效用户是否为文件属主
-G FILE #当前有效用户是否为文件属组


例子:

[root@test1 ~]# test -d /etc/sysconfig
[root@test1 ~]# echo $?
0
[root@test1 ~]# test -f /etc/sysconfig
[root@test1 ~]# echo $?
1
[root@test1 ~]# [ -d /etc/sysconfig/ ]   
[root@test1 ~]# echo $?
0
[root@test1 ~]# [ -f /etc/sysconfig/ ]
[root@test1 ~]# echo $?
1
[root@localhost ~]# test -e qiuhe.sh &&echo "yes"
yes

4.2 比较整数的数值

-eq : 等于

-ne : 不等于

-gt : 第一个数大于第二个数

-lt : 第一个数小于第二个数

-le : 第一个数小于或等于第二个数

-ge : 第一个数大于或等于第二个数

4.3 字符串的比较

= : 字符串内容相同

!= : 字符串内容不同,!表示相反的意思

-z : 字符串内容为空

-n : 字符是否存在

[root@localhost data]#str1=wang
[root@localhost data]#str2=zhou
[root@localhost data]#[ $str1 = $str2 ]
[root@localhost data]#echo $?
1

4.4 逻辑测试 与 或

与 第一个要为真 第二个也要为真

一个为假就为假

cmd1 && cmd2

一真即为真

第一个为真 那么 不用执行第二个

第一个为假 才需要执行第二个

cmd1 || cmd2

4.5 if语句的结构

  1. 分支结构
单分支

if 判断条件;

then   条件为真的分支代码

fi



双分支


if 判断条件; then
 条件为真的分支代码

else
 条件为假的分支代码

fi
  1. case

格式

case WORD in [PATTERN [| PATTERN]...) COMMANDS ;;]... esac

read -p          i

case $i in
PAT1)
 分支1
 ;;
PAT2)
 分支2
 ;;
...
*)
 默认分支
 ;;

  1. echo

echo -n 表示不换行输出

echo -e 表示输出转义符