一、Shell编程入门
什么是Shell
Shell是一个命令解释器,它在操作系统最外层,它的作用是把用户输入的命令交给操作系统,并将操作系统反馈的结果输出到屏幕,这种对话方式可以是交互也可以是非交互的(比如后台运行的服务)。
输入的命令会被SHELL解释器变成计算机能识别的二进制程序给计算机。
编程语言分类
- 低级语言
- 高级语言
低级语言
机器语言:二进制语言
汇编语言:符号语言,使用助记符来代替操作码,也就是用符号代替机器语言的二进制码。
它们都是面向机器的语言
高级语言
它是比较接近自然语言或者说人类语言的一种编程,用人们能够容易理解的方式进行编写程序。
静态语言:编译型语言 如:c 、 c++ 、 java,
动态语言:解释型语言 如: php 、 shell 、 python 、 perl
常见操作系统默认Shell
- bash(Linux下默认)
- sh(Solaris和FreeBSD默认)
- ksh(AIX默认)
shell的类型
在/etc/passwd第7个字段中列出了该用户默认的shell程序
root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin
查看系统默认Shell命令
[root@tz ~]# echo $SHELL /bin/bash [root@tz ~]# grep root /etc/passwd root:x:0:0:root:/root:/bin/bash
查看Shell版本
[root@tz yum.repos.d]# bash --version GNU bash, 版本 4.2.46(2)-release (x86_64-redhat-linux-gnu) Copyright (C) 2011 Free Software Foundation, Inc.
查看bash软件是否有破壳漏洞
[root@tz yum.repos.d]# env x='() { :;}; echo be careful' bash -c "echo this is a test"
this is a test
输出be careful需要升级bash
[root@tz yum.repos.d]# yum -y update bash [root@tz yum.repos.d]# rpm -qa bash bash-4.2.46-31.el7.x86_64
Shell的父子关系
用于登陆某个虚拟终端所启动的默认的交互shell是父shell,也就是开机启动的shell。
在父shell输入/bin/bash命令或其他等效bash命令时会创建一个子Shell。
[root@tzPC ~]# ps -f UID PID PPID C STIME TTY TIME CMD root 74219 74215 0 12:59 pts/0 00:00:00 -bash root 88330 74219 0 17:41 pts/0 00:00:00 ps -f [root@tzPC ~]# bash [root@tzPC ~]# ps -f UID PID PPID C STIME TTY TIME CMD root 74219 74215 0 12:59 pts/0 00:00:00 -bash root 88332 74219 0 17:41 pts/0 00:00:00 bash root 88348 88332 0 17:41 pts/0 00:00:00 ps -f
使用ps --forest命令展示父子shell嵌套结构
[root@tzPC ~]# ps --forest PID TTY TIME CMD 74219 pts/0 00:00:00 bash 88332 pts/0 00:00:00 \_ bash 88429 pts/0 00:00:00 \_ ps
进程列表
如下为命令列表
[root@tzPC ~]# pwd;ls;cd /etc;pwd;cd;pwd;ls
命令列表想成为进程列表需要加在()里,他们之间的区别是进程列表是生成了一个子shell来执行
可使用环境变量$BASH_SUBSHELL来区分是否生成了子shell,返回值0表示没有,1表示创建了子shell。
[root@tzPC ~]# pwd;ls;cd /etc;pwd;cd;pwd;ls; echo $BASH_SUBSHELL /root test1 test2 test.tar /etc /root test1 test2 test.tar 0 [root@tzPC ~]# (pwd;ls;cd /etc;pwd;cd;pwd;ls; echo $BASH_SUBSHELL) /root test1 test2 test.tar /etc /root test1 test2 test.tar 1
后台模式
&将命令放入后台执行,会返回一个后台作业号如下图为1,跟进程ID如下图89248
[root@tzPC ~]# sleep 10 & [1] 89248 [root@tzPC ~]# jobs [1]+ Running sleep 10 &
常用来后台运行备份打包文件等,文件不宜过大,因为断开连接后进程会结束!
[root@tzPC ~]# (tar -cf Rich.tar /home/rich;tar -cf My.tar /home/christine)&
携程
可以同时做两件事,他在后台生成一个子shell,并在子shell中执行命令
[root@tzPC ~]# coproc sleep 10 [1] 89748 [root@tzPC ~]# jobs [1]+ Running coproc COPROC sleep 10 &
COPROC是coproc命令给进程起的名字,可以使用扩展语法修改
注意分号跟空格
[root@tzPC ~]# coproc My_Job { sleep 10; } [1] 89854 [root@tzPC ~]# jobs [1]+ Running coproc My_Job { sleep 10; } &
[root@tzPC ~]# coproc (sleep 10;sleep 2) [1] 89978 [root@tzPC ~]# jobs [1]+ Running coproc COPROC ( sleep 10; sleep 2 ) & [root@tzPC ~]# ps --forest PID TTY TIME CMD 89416 pts/0 00:00:00 bash 89978 pts/0 00:00:00 \_ bash 89979 pts/0 00:00:00 | \_ sleep 89986 pts/0 00:00:00 \_ ps
外部命令
也称为文件系统命令,通常位于/bin、/usr/bin、/sbin或/usr/sbin中
可通过命令which或type找到命令所在的位置
[root@tzPC ~]# which ps /usr/bin/ps [root@tzPC ~]# type -a ps ps is /usr/bin/ps
外部命令执行时会创建一个子进程,称为衍生
[root@tzPC ~]# ps -f UID PID PPID C STIME TTY TIME CMD root 90651 90647 0 21:54 pts/0 00:00:00 -bash root 91076 90651 0 22:02 pts/0 00:00:00 ps -f
内部命令
与外部命令区别在于不需要子进程来执行,可使用type命令查看是否为内部命令
[root@tzPC ~]# type cd
cd is a shell builtin
内部命令执行速度更快效率更高
有些命令有内部命令也有外部命令,可使用type -a 查看
[root@tzPC ~]# type -a echo echo is a shell builtin echo is /usr/bin/echo