shell 简介
Shell 是一个用 C 语言编写的程序,一般我们说的shell编程,是指编写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
echo string
echo
是shell中用于输出的指令
如果需要转义,可以加上-e
选项;用-n
选项来禁止echo命令输出后换行
read
read
语句从键盘或文件的某一行文本中读入信息,并将其赋给一个变量
read varible1 varible2 ...
管道
cmd1 | cmd2
管道就是将一个命令cmd1
的输出当做输入传给另一个命令cmd2
。
|
是管道符号
一般情况下,管道后面的操作都是查找grep
、切割awk
或替换seb
重定向
-
系统已经定义的文件描述符
- 标准输入:0
- 标准输出:1
- 标准错误:2
-
重定向命令
命令 作用 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
exec
执行shell命令
-
操作文件描述符
使用
exec
创建的文件描述符重定向,是永久有效,直到显示取消重定向,可以看下面例子#! /bin/bash echo "input 6<&0 name ouput to stdout" exec 6<&0 0<name read var read var1 echo $var echo $var1 echo "close fd--6" exec 0<&6 6<&- echo -n "read from stdin:" read num echo "num = $num" echo "test over" >> name echo this is file name: cat name echo "redirect stdout to exec.log" exec 1>exec.log wc -l name echo "redirect stdout to stderr" exec 1>&2 echo "redirect stdout to stderr over" wc -l name echo "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/bash
echo this is '$0' = $0
echo '$1' = $1
echo '$2' = $2
echo '$#' = $#
echo '$@' = $@
echo '$*' = $*
echo '$$' = $$
echo '$?' = $?
预定义变量
预定义变量和环境变量相类似,也是在shell一开始时就定义了的变量,所不同的是,用户只能根据shell的定义来使用这些变量,而不能重定义它。所有预定义变量都是由$
符和另一个符号组成
$?
:打印前一个命令的退出状态$$
:打印正在执行进程的ID号$!
:后台运行的最后一个进程的进程号(PID)