Shell 是一个用 C 语言编写的程序,一般我们说的shell编程,是指编写shell脚本。
Shell 负责完成用户与内核之间的交互(shell是一个命令解释器,负责将用户的命令解析成操作系
统所能理解的指令)

创建一个shell脚本–test.sh
#! /bin/sh
echo "hello world"
echo "hello world"很简单就是输出字符串hello world
#! /bin/bash -->告诉操作系统用哪种类型的shell来解释执行该程序
如何执行改脚本,创建test.sh是个普通文件,使用ls -l可以查看,该文件没有可执行权限,使用
chmod u+x test.sh,给脚本添加上可执行权限。
ghost-linux@ghost-linux:~/shell$ ./test.sh
hello world
echo string
echo 是shell中用于输出的指令
如果需要转义,可以加上-e选项;用-n选项来禁止echo命令输出后换行

read语句从键盘或文件的某一行文本中读入信息,并将其赋给一个变量
read varible1 varible2 ...


cmd1 | cmd2
管道就是将一个命令cmd1的输出当做输入传给另一个命令cmd2。
|是管道符号
一般情况下,管道后面的操作都是查找grep、切割awk或替换seb

系统已经定义的文件描述符
重定向命令
| 命令 | 作用 |
|---|---|
| cmd > file | 将cmd重定向到file |
| cmd >> file | 将cmd重定向追加到file |
| m <& n | 将文件描述符n输入重定向到m |
| m >& n | 将文件描述符m输出重定向到n |
| cmd < file | 将file作为输入给cmd |
| cmd << deli | 从标准输入中读入,直至遇到deli分界符 |
| cmd > file 2>&1 | 把标准输出和标准错误一起重定向到file中 |


exec执行shell命令
操作文件描述符
使用exec创建的文件描述符重定向,是永久有效,直到显示取消重定向,可以看下面例子
#! /bin/bashecho "input 6<&0 name ouput to stdout"
exec 6<&0 0> nameecho this is file name:
cat nameecho "redirect stdout to exec.log"
exec 1>exec.log
wc -l nameecho "redirect stdout to stderr"
exec 1>&2
echo "redirect stdout to stderr over"
wc -l nameecho "ouput exec.log"
cat exec.log 
在shell中用户可以建立变量来存储数据,但不支持数据类型,变量名命名规则:数字、字母、下划线,不能以数字开头。
当前shell的环境设置的一些变量
export—设置新的环境变量
env—显示所有环境变量
set—显示所有本地的shell变量
unset—清除环境变量**(高危)**
常见的环境变量:
PWD=/home/ghost-linux/shell — 当前路径(绝对路径)
HOME=/home/ghost-linux — 家目录
USERNAME=ghost-linux —用户名
创建一个新的环境变量:

/etc/profile文件中,使用export创建环境变量source /etc/profile使环境变量生效 1、在shell编程中通常使用全大写变量,方便识别
2、变量的使用:在变量前加$
3、Linux Shell/bash从右向左赋值
4、使用unset命令删除变量的赋值 unset 变量名
COUNT=1
注意:
1、无数据类型,默认为字符串
2、“=”两边没有空格
$0:与键入的命令行一样,包含脚本文件名
$1,...$9:分别包含第一个到第九个命令行参数
$#:包含命令行参数的个数
$@ / $*:包含所有命令行参数 ——>“$1....$9”,区别在于$*返回的是一个字符串整体,$@是以空格分开的字符串集
$?:包含前一个命令的退出状态
$$:包含正在执行进程的ID号
#! /bin/bashecho this is '$0' = $0
echo '$1' = $1
echo '$2' = $2
echo '$#' = $#echo '$@' = $@
echo '$*' = $*
echo '$$' = $$
echo '$?' = $?

预定义变量和环境变量相类似,也是在shell一开始时就定义了的变量,所不同的是,用户只能根据shell的定义来使用这些变量,而不能重定义它。所有预定义变量都是由$符和另一个符号组成
$?:打印前一个命令的退出状态$$:打印正在执行进程的ID号$!:后台运行的最后一个进程的进程号(PID)