Shell是一个命令解释器,它的作用是节省5执行用户输入的命令及程序等,用户输入一
条命令,shell就解释执行一条。这种从键盘一输入命令,就可以立即得到回应的对话方式,
被称为交互的方式。
Shell存在于操作系统的最外层,负责直接与用户对话,把用户的输入解释给操作系统,
并处理各种各样的操作系统的输出结果,输出到屏幕返回给用户,当我们输入系统用户名
和密码,登录到linux后的所有操作都是由Shell解释并执行的。
java 需要 虚拟机解释器, 同理 shell脚本也需要 解析器
[root@node04 shells]# cat /etc/shells
/bin/sh
/bin/bash
/sbin/nologin
/bin/dash
/bin/tcsh
/bin/csh
Shell常见种类
Bsh:由贝尔实验室编写。Bsh是产生较早的UNIX Shell程序,实现了最基本的命令解释器的功能,同时也可以作为脚本编程语言
Csh:是因使用C语言的语法风格而得名,在用户的命令行交互界面上进行了很多改进,并增加了历史,别名,文件名替换,作业掏等功能,相比Bsh,Csh在更加适用为 用户提供命令交互操作
Ksh:在Bsh和Csh之后出现的,结合了两都的功能优势,兼具Bsh的语法和Csh的交互特性.
Bash:从名称可以看出是Bsh的升级版本,是著名的开源软件项目,目前大多数的Linux版本(包括Red Hat公司的Linux系统)都使用Bash 作为默认的Shell程序当运行 Shell程序时,实际运行的是Bash程序
Zsh:更多地基于交互式操作考虑进行设计的Shell程序,集成了Bash,Ksh等多种Shell程序的优点
新建一个 /opt/a.sh文件
#!/bin/bash
echo 'hello world'
#!是一个约定的标记,它告诉系统这个脚本需要什么解释器来执行,即使用哪一种 Shell。
echo 命令用于向窗口输出文本。
执行shell脚本
[root@node04 shells]# /bin/sh 01.sh
输出 hello world
有多种执行shell的方式 如 ./ sh bash csh 等等
在shell脚本中, 定义变量时,变量名不加美元符号($),如: your_name="runoob.com"
注意 : 变量名和等号之间不能有空格,这可能和你熟悉的所有编程语言都不一样
变量的规则
命名只能使用英文字母,数字和下划线,首个字符不能以数字开头。
中间不能有空格,可以使用下划线(_)。
不能使用标点符号。
不能使用bash里的关键字(可用help命令查看保留关键字)。
有效变量名
RUNOOB
LD_LIBRARY_PATH
_var
var2
无效变量名
?var=123
user*name=runoob
想要使用变量只需加个$符就行了
your_name=“zhangsan”
echo $your_name
如果想在变量后追加字符的话就加个{}
echo ${your_name} abc
如果不加{}解释器就会把 $your_nameabc当成一个变量(其值为空)
unset 变量名
unser可以使我们删除一下不要的变量
使用 readonly 命令可以将变量定义为只读变量,只读变量的值不能被改变。
#!/bin/bash
myUrl="http://www.google.com"
readonly myUrl
myUrl="http://www.runoob.com"
运行结果是
/bin/sh: NAME: This variable is read only.
提示你只能读不能修改
单引号
skill='java'
str='I am goot at $skill'
echo $str
输出结果是 I am goot at $skill
因为在单引号中的任何字符都会原样输出 单引号中变量是无效的
双引号```
skill='java'
str="I am goot at $skill"
echo $str
输出结果为:
I am goot at java
双引号里可以有变量,双引号中可以出现字符
获取字符串的长度
skill='java'
echo ${skill} # 输出结果: java
echo ${#skill} # 输出结果: 4
在变量名前面加个#就可以获取变量中字符的长度
提取子字符串
str="I am goot at $skill"
echo ${str:2} # 输出结果为: am goot at java
echo ${str:2:2} # 输出结果为: am
str :n :m 从第n个字符取出m个字符
查找字符串
如:计算am在哪个位置
str="I am goot at $skill"
echo `expr index "$str" am` # 输出是: 3
Shell 和其他编程一样,支持包括:算术、关系、布尔、字符串等运算符
例如,两个数相加:
val=`expr 2 + 2`
echo $val
注意:
表达式和运算符之间要有空格,例如 2+2 是不对的,必须写成 2 + 2
运输符 | 说明 | 举例 |
---|---|---|
+ | 加法 | expr $a + $b 结果为 30 |
- | 减法 | expr $a - $b 结果为 -10 |
* | 乘法 | expr $a \* $b 结果为 200 |
/ | 除法 | expr $b / $a 结果为 2 |
% | 取余 | expr $b % $a 结果为 0 |
= | 赋值 | a=$b 将把变量 b 的值赋给 a |
== | 等于 | [ $a == $b ] 返回 false |
!= | 不等于 | [ $a != $b ] 返回 true |
注意:条件表达式要放在方括号之间,并且要有空格.
if 语句语法格式:
if condition; then
command1
command2
...
commandN
fi
if else 语法格式:
if condition; then
command1
command2
...
commandN
else
command
fi
if else-if else 语法格式:
if condition1; then
command1
elif condition2; then
command2
else
commandN
fi
运算符 | 说明 |
---|---|
-eq | 检测两个数是否相等,相等返回 true。 |
-ne | 检测两个数是否不相等,不相等返回 true。 |
-gt | 检测左边的数是否大于右边的,如果是,则返回 true。 |
-lt | 检测左边的数是否小于右边的,如果是,则返回 true。 |
-ge | 检测左边的数是否大于等于右边的,如果是,则返回 true。 |
-le | 检测左边的数是否小于等于右边的,如果是,则返回 true。 |
for循环格式
for variable in (list);
do
command
command
...
done
while循环用于不断执行一系列命令,也用于从输入文件中读取数据;命令通常为测试条件。其格式为:
while condition; do
command
done
Shell case语句为多选择语句。可以用case语句匹配一个值与一个模式,如果匹配成功,执行相匹配的命令。case语句格式如下
case 值 in
模式1)
command1
command2
...
commandN
;;
模式2)
command1
command2
...
commandN
;;
esac
在循环过程中,有时候需要在未达到循环结束条件时强制跳出循环,Shell使用两个命令来实现该功能:break和continue。
break命令允许跳出所有循环(终止执行后面的所有循环)。
continue命令与break命令类似,只有一点差别,它不会跳出所有循环,仅仅跳出当前循环