一、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

 

posted @ 2020-04-04 15:14  努力吧阿团  阅读(240)  评论(0编辑  收藏  举报