首页 > 代码库 > Linux shell
Linux shell
shell脚本
sed和awk命令
shell脚本概述:
我们所输入的命令计算机是不识别的,这时就需要一种程序帮助我们进行翻译,变成计算机所识别的二进制程序,同时又将计算机所执行的结果翻译给我们,这个就是shell
linux的shell脚本是一种特殊的应用程序,常见的shell解释器有很多种使用不同的shell时期内部指令命令提示方式方面会存在一些区别,可以通过/etc/shells文件查看
[root@zq ~]# cat /etc/shells /bin/sh /bin/bash /sbin/nologin /usr/bin/sh /usr/bin/bash /usr/sbin/nologin /bin/tcsh /bin/csh
/bin/bash是大多数Linux中默认的shell解释器,之后的所有脚本编写都是bash脚本
我们可以添加别的shells 比如zsh
[root@zq ~]# rpm -ivh /mnt/Packages/zsh-5.0.2-14.el7.x86_64.rpm 警告:/mnt/Packages/zsh-5.0.2-14.el7.x86_64.rpm: 头V3 RSA/SHA256 Signature, 密钥 ID fd431d51: NOKEY 准备中... ################################# [100%] 正在升级/安装... 1:zsh-5.0.2-14.el7 ################################# [100%] [root@zq ~]# cat /etc/shells /bin/sh /bin/bash /sbin/nologin /usr/bin/sh /usr/bin/bash /usr/sbin/nologin /bin/tcsh /bin/csh /bin/zsh 多了一个zsh [root@zq ~]# zsh 运行zshell [root@zq]~# cd /etc/sysctl.d 显示绝对路径 [root@zq]/etc/sysctl.d# exit 退出回到bash
编写一个shell脚本
以.sh后缀名
通常linux不以后缀名区分文件,为了方便记忆这里我们就以.sh结尾
vim first.sh
#!/bin/bash 指定通过哪种shell执行 # This is my first shell-script 描述你写的shell功能 注释不生效 mkdir /root/shell 创建 root下 shell目录 ifconfig 查看
总结一下:
当写一个比较大的脚本时,如果没有一个好的注释,其他人很难明白其中的意思,执行用的时候有困难
写完之后要给这个脚本加权限
chmod u+x first.sh
./first.sh 执行
[root@zq ~]# ll /root/first.sh -rw-r--r-- 1 root root 71 5月 8 21:26 /root/first.sh [root@zq ~]# chmod u+x first.sh [root@zq ~]# ./first.sh eno16777736: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500 inet 192.168.1.63 netmask 255.255.255.0 broadcast 192.168.1.255 inet6 fe80::20c:29ff:fedf:de30 prefixlen 64 scopeid 0x20<link> ether 00:0c:29:df:de:30 txqueuelen 1000 (Ethernet) RX packets 0 bytes 0 (0.0 B) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 0 bytes 0 (0.0 B) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536 inet 127.0.0.1 netmask 255.0.0.0 inet6 ::1 prefixlen 128 scopeid 0x10<host> loop txqueuelen 0 (Local Loopback) RX packets 4 bytes 304 (304.0 B) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 4 bytes 304 (304.0 B) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 virbr0: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500 inet 192.168.122.1 netmask 255.255.255.0 broadcast 192.168.122.255 ether 52:54:00:6e:7f:7d txqueuelen 0 (Ethernet) RX packets 0 bytes 0 (0.0 B) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 0 bytes 0 (0.0 B) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
[root@zq ~]# ls /root/ anaconda-ks.cfg first.sh initial-setup-ks.cfg shell
执行脚本的不同方式
第一种使用绝对路径执行
第二种使用相对路径执行,eg:./方式
第三种使用sh命令执行 格式:sh/路径/脚本文件名.sh 不需要执行权限
第四种 bash命令来执行 格式:同上
变量:
定义:可以存放一个可变的值的空间
常见的shell变量:自定义变量,环境变量,位置变量,预定义变量
一般使用echo 输出变量 变量名的格式=$变量名
自定义变量:
. 用户根据自己的环境自己定义变量
. bash中比较简单的变量,不用进行提前声明,而是直接指定变量名称并赋给初始值
. 定义变量的基本格式为变量名=变量值等号两边不允许出现空格
. 变量名称只能以字母和下划线开头名称中不能包含特殊字符
eg:定义一个变量名为zq值为5 的变量和Zq值为4
[root@zq ~]# zq=5 [root@zq ~]# echo $zq 5 [root@zq ~]# Zq=4 [root@zq ~]# echo $Zq 4
直接在命令行定义,以上就是定义一个变量并赋值,通过echo进行输出变量,$是引用变量的特殊字符(必须使用¥符号)
echo 和调用的变量之间必须用空格隔开
两个可以一起调用
[root@zq ~]# echo $zq $Zq 5 4
当变量名和后面的字符容易混淆的时候应该用{}将变量名括起来
[root@zq ~]# echo $zqsystem 不可以 [root@zq ~]# echo {$zq}system 不正确 大括号的位置不对 {5}system [root@zq ~]# echo ${zq}system 正确,大括号必须把变量名单独括起来 5system
read命令
除了上面的赋值之外还可以使用read命令进行赋值,read命令用来提示用户输入信息,从而实现简单的交互式过程(其实我们所输入的命令就是一种交互式的过程)
执行时需要从标准输入设备键盘读取一行,并以空格为分隔符
比如我们同时定义两个变量操作如下
[root@zq ~]# read zz qq 56 用户输入变量值 一定要隔开 [root@zq ~]# echo $zz $qq 56 [root@zq ~]# echo $zz 56 [root@zq ~]# echo $qq 从这就可以看出问题 [root@zq ~]# read zz qq 5 6 [root@zq ~]# echo $zz $qq 5 6 [root@zq ~]# echo $zz 5 [root@zq ~]# echo $qq 6 这是正确的显示效果
为了交互式更加的形象,提高易用性,加上-p选项来设置提示信息
[root@zq ~]# read -p "input your passwd:" passwd input your passwd:123456 [root@zq ~]# echo $passwd 123456
数值变量的运算:(这不是shell的强项)
shell脚本的数值运算多用于脚本程序的过程控制(如循环次数,使用量比较等)
在shell环境中,只能进行比较简单的整数运算
运算符与变量之间必须有一个空格位,整数的运算主要是通过内部命令expr 命令进行运算
格式: 变量1 运算符 变量2
+-*/ 取余%
[root@zq ~]# a=10 [root@zq ~]# b=20 [root@zq ~]# expr $a + $b 30 [root@zq ~]# expr $a+$b 没有空格显示的结果 10+20 [root@zq ~]# expr $a+ $b expr: 语法错误 [root@zq ~]# expr $a + $b 30 [root@zq ~]# expr $a +$b expr: 语法错误 [root@zq ~]# expr $a * $b expr: 语法错误 [root@zq ~]# expr $a \* $b shell里面的乘法运算 我也是醉了(学python的悠着点儿这块儿) 200 [root@zq ~]# expr $a / $b 非整除0显示 0 [root@zq ~]# expr $a % $b 10
若要将运算结果赋值给其他变量可以这么做
[root@zq ~]# ab=$(expr $a + $b) [root@zq ~]# echo $ab 30
Linux shell