定义
Shell是什么
•shell既是一种命令语言,又是一种程序设计语言
•是一个环境,提供了对linux(unix)系统的接口
•向用户接收输入,并根据输入执行程序,显示程序的输出
•可以运行用户的命令,程序和shell脚本
对于用户来说,shell是最重要的实用程序,深入了解和熟练掌握shell的特性极其使用方法,是用好Unix/Linux系统的关键
Shell的分类
•就像有不同类型的系统一样,shell也有不同版本,每个版本都有自己的一套命令和功能
•UNIX shell写于20世纪70年代中期,由斯蒂芬·伯恩,再新泽西AT&T贝尔实验室
- Bourne shell 提示符 $
Bourne shell 包括 Bourne shell (sh)、Korn shell(ksh)、Bourne Again Shell 三种类型。
- C shell 提示符 %
C shell包括csh、tcsh两种类型
Shell脚本解释器
查看系统默认的shell
echo $SHELL
[root@single conf]# echo $SHELL
/bin/bash
bash由于易用和免费,在日常工作中被广泛使用。同时,bash也是大多数Linux系统默认的Shell脚本解释器。
查看系统支持的shell
cat /etc/shells
[root@single conf]# cat /etc/shells
/bin/sh
/bin/bash
/usr/bin/sh
/usr/bin/bash
Shell规范
- Shell脚本的文件名以.sh为扩展名 例如:test.sh
- Shell脚本的文件应该赋予执行权限(刚创建的文件没有执行权限)
chmod u+x test.sh - 一个规范的Shell脚本在第一行会指出由哪个解释器来执行脚本中的内容,这一行内容在Linux中的编程一般为:#!/bin/bash
- Shell脚本的执行方式
./test.sh
命令
控制台输入/输出
echo [-n] "..." 控制台输出
read VAR 控制台输入
case:
#!/bin/bash
echo -n "please enter your name => "
read NAME
echo "your name is $NAME"
result:
[root@single shell]# ./test.sh
please enter your name => jun
your name is jun
注释
单行:#...
多行::<<!...!
case:
#!/bin/bash
:<<!
echo -n "please enter your name => "
read NAME
echo "your name is $NAME"
!
echo "break"
#echo -n "hello shell"
result:
[root@single shell]# ./test.sh
break
变量
语法格式:变量名=变量值
•数字、字母、下划线、一般字母大写
•值可以是一个数字、文本、文件名、设备或任何其他类型的数据,不可以是指针
•shell可以创建,分配和删除变量
变量类型
类型 | 含义 |
---|---|
局部变量 | 局部变量在脚本或命令中定义,仅在当前shell实例中有效,其他shell启动的程序不能访问局部变量 |
环境变量 | 所有的程序,包括shell启动的程序,都能访问环境变量,有些程序需要环境变量来保证其正常运行。可以用过set命令查看当前环境变量 |
shell变量 | 由shell程序设置的特殊变量。shell变量中有一部分是环境变量,有一部分是局部变量,这些变量保证了shell 的正常运行 |
变量用法
- 局部变量
创建
NAME="henry"
AGE=18
使用
echo "$NAME,$AGE"
echo $NAME
取消
unset NAME
常量
readonly NAME
case:
[root@single shell]# NAME="JUN"
[root@single shell]# AGE=22
[root@single shell]# echo "$NAME,$AGE"
JUN,22
[root@single shell]# unset NAME
[root@single shell]# echo "$NAME,$AGE"
,22
[root@single shell]# NAME="jun"
[root@single shell]# readonly NAME
[root@single shell]# echo $NAME
jun
[root@single shell]# NAME="kun"
-bash: NAME: readonly variable
- 环境变量
全局环境变量:跨实例访问
临时环境变量:当前登录有效的临时环境变量
export -p #列出所有环境变量
export -n VAR #删除环境变量VAR
export VAR #添加环境变量VAR
[root@single shell]# export -p
declare -x CLASS_PATH=".:/opt/software/jdk180/lib/tools.jar:/opt/software/jdk180/lib/dt.jar"
declare -x HADOOP_HOME="/opt/software/hadoop/hadoop260"
declare -x HBASE_HOME="/opt/software/hadoop/hbase120"
···
[root@single shell]# export jun
[root@single shell]# export -p
···
declare -x jun
[root@single shell]# export -n jun
[root@single shell]# export -p
···
- shell变量
符号 | 含义 |
---|---|
$$ | 当前shell进程编号 |
$0 | 当前脚本的文件名 |
$n | 脚本参数 |
$# | 脚本参数的数量 |
$* | 脚本参数的完整集合 |
$@ | 脚本参数的独立集合 |
$? | 上一条命令的执行结果状态值或函数的返回值:0表示正常,1表示失败 |
$! | 最后一个后台命令的进程号 |
$* 和 $@ 的区别
不加"两者相同
加上"则$*代表整体,而$@代表个体