shell初学

一、什么是shell

  Shell中文意思贝壳, 寓意类似内核的壳。Shell是指一种应用程序, 这个应用程序提供了一个界面, 用户通过这个界面访问操作系统内核的服务, 简而言之就是只要能够操作应用程序的接口都能够称为SHELL。狭义的shell指的是命令行方面的软件, 广义的SHELL则包括图形界面。

Shell是一个用 C 语言编写的程序, 它是用户使用 Linux 的桥梁。Shell既是一种命令语言, 又是一种程序设计语言
所以说, shell可以指代两层意思:

1、命令解释器 
  sh (Bourne shell) 是一个早期的重要shell , 1978年由史蒂夫.伯恩编写, 并同version 7 unix一起发布。

  bash (Bourne - Again shell ) 是一个为GNU 计划编写的Unix shell 。1987年由布莱恩.福克斯创造。主要目标是与POSIX 标准保持一致, 同时兼顾对sh 的兼容, 是各种Linux 发行版标准配置的shell , 在Linux 系统上/bin/sh 往往是指向/bin/bash 的符号链接。

  dash (Debian Almquist shell ) 一种 Unix shell 。它比 Bash 小, 只需要较少的磁盘空间, 但是它的对话性功能也较少。它由 NetBSD 版本的Almquist shell (ash)发展而来, 于1997年由赫伯特.许 (Herbert Xu) 移植到Linux 上, 于2002 年改名为 dash。

//sh 遵循POSIX规范: " 当某行代码出错时, 不继续往下解释" 。bash 就算出错, 也会继续向下执行。
//sh 跟bash 的区别, 实际上是bash 有没开启POSIX 模式的区别。
//简单说, sh 是bash 的一种特殊的模式, sh就是开启了POSIX 标准的bash , /bin/sh	相当于
/bin/bash	--POSIX。
//在工inux 系统上/bin/sh 往往是指向/bin/bash 的符号链接
// ln -s /bin/bash /bin/sh

我们可以SHELL实现对Linux系统的管理例如:
    1.文件管理
    2.用户与权限管理
    3.进程管理
    4.磁盘管理
    5.网络管理
    6.软件
2、shell脚本
Shell脚本(shell script)是一种为shell编写的脚本程序。常说的shell通常都是指shell 脚本,但shell和shell script是两个不同的概念。通常说"shell编程”都是指shell脚本编程, 不是指开发shell自身。
GNU bash
Bash(GNU Bourne-Again Shell)是许多Linux平台的内定Shell,事实上,还有许多传统 UNIX上用的Shell,像tcsh、csh、ash、bsh、ksh等等,Shell Script大致都类同,即命令大都 通用。当您学会一种Shell以后,其它的Shell会很快就上手,大多数的时候,一个Shell Script通 常可以在很多种Shell上使用。
bash是大多数Linux系统以及Mac OS X v10.4默认的shell, bash具有极强的可移植性,它能运行 于大多数Unix风格的操作系统之上,甚至被移植到了 Microsoft Windows上的C ygwin系统中,以实 现windows的虚拟接口。此外,它也被DJGPP项目移植到了MS-DOS上。bash的命令语法是 Bourne shell命令语法的超集。数量庞大的Bourne shell脚本大多不经修改即可以在bash中执行, 只有那些引用了 Bourn e特殊变量或使用了 Bourn e的内置命令的脚本才需要修改。
bash的命令语法很多来自Korn shell (ksh)和C shell (csh),例如命令行编辑,命令历史, 目录栈,$RANDOM和$PPID变量,以及POSIX的命令置换语法:$(...)„ GNU bash作为一个交互 式的shell,按下TAB键即可自动补全已部分输入的程序名,文件名,变量名等等。

posix:

―:简单来说:
POSIX (Portable Operating System Interface,可移植操作系统接口),是操作系统为应用程 序提供的接口标准。
简单的说,POSIX (主要是解决了应用程序在各个操作系统上兼容性这样一个普遍存在的问题。只要一 个应用程序的开发是为了在一个实现了 POSIX模式的操作系统上运行,那么这个应用程序就可以在所用实 现了 POSIX模式的操作系统上运行。

二:
1、POSIX定义
POSIX: Portable Operating System Interface of Unix.,可移植操作系统接口。X表示其 是对Unix API的传承。
POSIX标准由IEEE (电气和电子工程师协会)发布,定义了操作系统应该为应用程序提供的接口标准, 是IEEE为要在各种U NIX操作系统上运行软件而定义的一系列API标准的总称。
简单可以理解POSIX标准是为操作系统设计API时遵循的规范,一套规范的系统调用集。
2、POSIX的诞生/解决的问题
POSIX的诞生和Unix的发展是密不可分的。当年最早的Unix,源代码流传出去了,加上早期的Unix不 够完善,于是之后出现了好些独立开发的与Unix基本兼容但又不完全兼容的OS,通称Unix-like OS。 这样版本混乱的情况导致相互之间的竞争和不兼容之处越来越多,给软件的可移植性带来很大困难,对 Unix的发展极为不利。
为了提高兼容性和应用程序的可移植性,结束混乱局面,IEEE提出了POSIX标准,POSIX在源代码级别 上定义了一组最小的Unix(类unix)操作系统接口。这套标准涵盖了很多方面,比如Unix系统调用的C 语言接口,shell程序和工具、线程和网络编程等。POSIX标准意在期望获得源代码级别的软件可移植 性。为一个POSIX兼容的操作系统编写的程序,可以在任何其他POSIX操作系统上编译执行。
POSIX现在已经发展成为一个非常庞大的标准族,并不局限于Unix,—些其他的操作系统,如 Microsoft windows NT, Linux等都支持或者部分支持POSIX标准。
3、POSIX标准的思路
问题:不同操作系统内核为同一功能提供的系统调用(函数)是不同的,例如创建进程,linux下是 fork函数,windows下是createprocess函数,如果在Linux下写了一个程序用到了fork函数,要往 windows上移植就得把源代码里面的fork通通改成createprocess,然后重新编译。

解决方法:定义POSIX标准,linux和windows实现基于POSIX标准,提供同样的接口,例如定义创 建进程的接口为posix_fork(示例名/非真实名字),且linux和windows都把各自创建进程的调用封 装成posix_fork,都声明在unistd.h里。这样程序员编写应用时,只需包含unistd.h,调用这个 POSIX标准中定义的API接口: posix_fork函数,即可实现源代码级别的可移植。

二、shell交互式环境

登录用户后进入解释器bash的交互式环境,可以敲命令,交互式环境的命令提示符如下
[root@xxx ~]#	#号代表超级管理员用户对应的命令行
[root@xxx ~] $	$号代表普通用户对应的命令行
root==>当前登录的用户
@=====>分隔符
xxx==>主机名
~====>当前所在的路径

//创建普通系统用户 useradd egon
//交互式设置密码 passwod egon
//非交互式设置密码
echo "123" | passwd --stdin egon

三、shell命令语法

三部分组成
•1、命令:要执行的操作(必选)
•2、选项:如何具体执行操作,通常以+开头(可选)
•3、参数:具体操作的对象(可选)
例
ls
ls /root
ls -l /root

四、bash解释器特性

1.命令和文件自动补全注意:Tab只能补全命令和文件
命令# ls /etc/sysconfig/network-scripts/ifcfg-ens33

2.快捷键(^=Ctrl)
^c	终止前台运行的程序
^d 退出等价exit
^l 清屏
^a 光标移到命令行的最前端
^e	光标移到命令行的后端
^r	搜索历史命令,利用关键词
Alt+.引用上一个命令的最后一个参数,等价于!$

3. 查看历史命令

1、查看历史命令
命令# history

2、清空历史命令
命令# history -c

3、历史命令保存文件: cat ~/.bash_history

4、历史命令默认保存1000条, 可以修改/etc/profile中的HISTSIZE=2000

5、查找历史命令并运行
(1)	光标上下键
(2)	^r           搜索历史命令(输入一段某条命令的关键字:必须是连续的)
(3)	!220         执行历史命令中第220条命令
(4)	!字符串      搜索历史命令中最近一个以XXX字符开头的命令,例如!ser
(5)	!$           引用上一个命令的最后一个参数
命令# ls /root /home
命令# cd !$
命令# ls /root  /home
命令# cd !$
 cd /home
命令# ls /root /home 
命令## touch !$/filel
touch /home/filel

4.别名
别名
#alias //查看系统当前的别名
   ll='ls -l 一一color=tty'
#alias egon='ls /etc/sysconfig/network-scripts/'	//建立别名
#unalias egon
命令# grep root /etc/passwd // 默认有颜色
命令# alias grep
   alias grep='grep --color=auto'

五 、命令查找优先级:

bash shell 查找命令顺序:
== > 以路径 (绝对路径, 相对路径) 开始命令, 例如: /bin /ls	或 cd  /bin; ./ls
 == > alias
  == > compound commands
   == > function
    == > build in, 如cd , kill , pwd、alias 、echo 等, 可以用" type -a 命令" 查看
     == > hash
      == > sPAmH , 环境变量, 查看环境变量echo sPAmH , 例如/bin /ls
       == > error: command not found

复合命令例如
for ( ( i=0;i< =3;i++ ) )do echo 123;done
函数例如
function f( ){ echo 123; }, 注意{}左右两边有空格

# ps: 查看命令的位置: which 命令

六 、查看帮助信息

1 、man手册
// 1、简单使用
man 命令

// 2、详解如下
man 手册名, 例如man ls
搜索: /- h	n N

技巧一: 按章节来查找, 常用的是1 (命令用法) , 5 (文本规范) , 8 (系统管理命令)
/usr/bin /passwd           命令, 修改用户密码    man 1 passwd
/etc/passwd                保存用户信息的文件    man 5 passwd
/etc/exports               man exports          man 5 exports
技巧二: 按关键字检索 (适合记不住手册的全名时使用)
man  - k  " selinux "	//手册名或手册描述中包含关键字 selinux
注: 从whatis 数据库里找 (# makewhatis )

技巧三: 在所有章节中查询
# man - a passwd # man - f passwd
# man - f passwd

2、--help
命令--help
// 例1
命令# ls -- help
用法: ls [ 选项] ... [ 文件] ...

ls 常见选项
-a	all ,查看目录下的所有文件, 包括隐藏文件
-l	长列表显示
-h	human 以人性化方式显示出来
-d	只列出目录名, 不列出其他内容
-t	按修改时间排序
-r	逆序排列
-i	显示文件的inode 号 (索引号)

3、参考文档配置模块文件
命令# ls  /usr/share/doc/pam-1.1.8/ 
命令# firefox /usr/share/doc/pam-1.1.8/html /Linux-PAM SAG.html
4、官方手册
5、baidu,google

七、常用命令

设置主机名
命令# hostnamectl set-hostname aliyun // 退出重新 进入即可看到

设置时间
[root@aliyun ~]# date --help
查看时间
# date "+%Y_%m_%d	%H-%M-%S"
设置时间
#date -s "2018-05-17 09:51:50
//写入到硬件时钟
注意:这里说的是系统时间,是linux由操作系统维护的。
硬件时钟是指主机板上的时钟设备,也就是通常可在BIO S画面设定的时钟,硬件时间存放于CMOS中。
系统时钟则是指kernel中的时钟,当Linux启动时,Linux操作系统将时间从CMOS中读到系统时间变量 中,之后系统时钟即独立运作。所有Linux相关指令与函数都是读取系统时钟的设定。
linux系统设置硬件时钟时,提供两种时区选择,一种为本地时区,此时硬件时间与系统时间相同;另一 种为UT C时区,此时硬件时间存的是UTC时间,系统初始化时会转换为本地时间后再设置为系统时钟的时 间。
以后修改时间通过修改系统时间实现。为了保持系统时间与CMOS时间的一致性,Linux每隔一段时间会 将系统时间写入CMOS。由于该同步是每隔一段时间(大约是11分钟)进行的,在我们执行date -s后,如果马上重起机器,修改时间就有可能没有被写入C MOS,这就是问题的原因。
如果要确保修改生效可以执行如下命令。
命令#hwclock —w               这个命令强制把系统时间写入CMOS。
//注意:要使系统时间准确,最好还是使用ntp方式,ps:centos7用chrony替换ntp
此处暂作了解:https://www.cnblogs.com/linhaifeng/articles/13471989.html
使用ntpdate命令从网络同步时间,再同步到硬件时钟
ntpdate命令是使用NTP协议来从网络同步时间的命令。NTP=Network Time Protocol网络时间协议。
#ntpdate 0.cn.pool.ntp.org
#date
#hwclock -w
#ps:阿里云提供了7个NTP时间服务器也就是Internet时间同步服务器地址
ntp1.aliyun.com
ntp2.aliyun.com
ntp3.aliyun.com
ntp4.aliyun.com
ntp5.aliyun.com
ntp6.aliyun.com
ntp7.aliyun.com
重启 
shutdown -r 10         // 10 分钟后重启 
shutdown -r 0          // 立即重启 
shutdown -r now        // 立即重启 
init 6                //立即重启 
reboot                //立即重启

关机
shutdown -h 10        // 10 分钟后关机 
shutdown -h 0         // 立刻关机 
shutdown -h now       // 立刻关机 
halt                  //立刻关机
poweroff              //立刻关机

取消正在进行的关机或重启
showdown -c

注销登录的账号
exit
logout 
ctrl+d

原文地址:https://www.cnblogs.com/qiukangle/p/13952595.html