1.初识shell(linux半边天)
Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁。Shell 既是一种命令语言,又是一种程序设计语言。
Shell 是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访问操作系统内核的服务。
Ken Thompson 的 sh 是第一种 Unix Shell,Windows Explorer 是一个典型的图形界面 Shell。
shell脚本
Shell 脚本(shell script),是一种为 shell 编写的脚本程序。
业界所说的 shell 通常都是指 shell 脚本,但读者朋友要知道,shell 和 shell script 是两个不同的概念。
由于习惯的原因,简洁起见,本文出现的 “shell编程” 都是指 shell 脚本编程,不是指开发 shell 自身。
shell环境
Shell 编程跟 JavaScript、php 编程一样,只要有一个能编写代码的文本编辑器和一个能解释执行的脚本解释器就可以了。
Linux 的 Shell 种类众多,常见的有:
- Bourne Shell(/usr/bin/sh或/bin/sh)
- Bourne Again Shell(/bin/bash)
- C Shell(/usr/bin/csh)
- K Shell(/usr/bin/ksh)
- Shell for Root(/sbin/sh)
- ……
我在这里用的是Bash,也就是 Bourne Again Shell,由于易用和免费,Bash 在日常工作中被广泛使用。同时,Bash 也是大多数Linux 系统默认的 Shell。
在一般情况下,人们并不区分 Bourne Shell 和 Bourne Again Shell,所以,像 #!/bin/sh,它同样也可以改为 #!/bin/bash。
#! 告诉系统其后路径所指定的程序即是解释此脚本文件的 Shell 程序。
第一个shell脚本
vim
#!/bin/bash
echo "Hello World”
#! 是一个约定的标记,它告诉系统这个脚本需要什么解释器来执行,即使用哪一种 Shell。
echo 命令用于向窗口输出文本。
shell基础规则与习惯
基础规则- 执行脚本
1.作为可执行程序
将上面的代码保存为 以.sh结尾的文件(test.sh),并 cd 到相应目录:
chmod +x ./test.sh #使脚本具有执行权限
./test.sh #执行脚本
注意,一定要写成 ./test.sh,而不是 test.sh,运行其它二进制的程序也一样,直接写 test.sh,linux 系统会去 PATH 里寻找有没有叫 test.sh 的,而只有 /bin, /sbin, /usr/bin,/usr/sbin 等在 PATH 里,你的当前目录通常不在 PATH 里,所以写成 test.sh 是会找不到命令的,要用 ./test.sh 告诉系统说,就在当前目录找。
2、作为解释器参数
这种运行方式是,直接运行解释器,其参数就是 shell 脚本的文件名,如:
/bin/sh test.sh
/bin/php test.php
这种方式运行的脚本,不需要在第一行指定解释器信息,写了也没用。
3. 方法实例
#方法1 sh ※※※※※※
[root@manager /server/scripts]# sh 2.3-1-exec.sh
tar: 从成员名中删除开头的“/”
#方法2 .或source
[root@manager /server/scripts]# . 2.3-1-exec.sh
tar: 从成员名中删除开头的“/”
#方法3 输入重定向方法
[root@manager /server/scripts]# sh <2.3-1-exec.sh
tar: 从成员名中删除开头的“/”
[root@manager /server/scripts]# ll /tmp/etc.tar.gz
-rw-r--r-- 1 root root 10246600 1月 8 10:51
/tmp/etc.tar.gz
#linux 支持 < 很多 tr xargs 三剑客
#方法4 绝对路径方法
[root@manager /server/scripts]# ll
/server/scripts/2.3-1-exec.sh
-rwxr-xr-x 1 root root 31 1月 8 10:50
/server/scripts/2.3-1-exec.sh
[root@manager /server/scripts]# /server/scripts/2.3-1-
exec.sh
tar: 从成员名中删除开头的“/”
书写shell脚本的习惯
注意,变量名和等号之间不能有空格,这可能和你熟悉的所有编程语言都不一样。同时,变量名的命名须遵循如下规则:
- 命名只能使用英文字母,数字和下划线,首个字符不能以数字开头。
- 中间不能有空格,可以使用下划线(_)。
- 不能使用标点符号。
- 不能使用bash里的关键字(可用help命令查看保留关键字)。
- 书写脚本 加上 命令解释器 #!/bin/bash 脚本默认使用的命令解释器
- 加上版权信息: 脚本作者 版本 时间 (后面讲解vimrc 只要创建脚
本.sh 自动加上 版本信息) - 书写成对的符号 ‘’ “” `` $() () [] {}
shell变量
局部变量在脚本或命令中定义,仅在当前shell实例中有效,其他shell启动的程序不能访问局部变量。
shell变量是由shell程序设置的特殊变量。shell变量中有一部分是环境变量,有一部分是局部变量,这些变量保证了shell的正常运行
shell字符串
字符串是shell编程中最常用最有用的数据类型(除了数字和字符串,也没啥其它类型好用了),字符串可以用单引号,也可以用双引号,也可以不用引号。单双引号的区别跟PHP类似。
[root@manager ~]# echo '$PATH $(hostname) `whoami`
{1..5}'
$PATH $(hostname) `whoami` {1..5}
[root@manager ~]# echo "$PATH $(hostname) `whoami`
{1..5}"
/sbin:/usr/sbin:/bin:/usr/bin manager root {1..5}
[root@manager ~]# echo $PATH $(hostname) `whoami`
{1..5}
/sbin:/usr/sbin:/bin:/usr/bin manager root 1 2 3 4 5
环境变量
必知必会的环境变量
PATH
- 环境变量记录着 linux命令的
位置
PS1
- 命令行提示符格式
LANG
- 语言.字符集4
UID
- 当前用户的uid
TMOUT
- 用户没有操作的时候 超时时
间 超过时间自动退出用户
HISTSIZE
- HIST history 历史 HISTSIZE
控制history 命令最多记录多
少条命令
HISTFILESIZE
- FILE文件 历史命令的文件中
最多记录多少条命令
HISTCONTROL
- 里面存放的命令 会在下1个命
令执行前运行
shell传递参数
我们可以在执行 Shell 脚本时,向脚本传递参数,脚本内获取参数的格式为:$n。n 代表一个数字,1 为执行脚本的第一个参数,2 为执行脚本的第二个参数,以此类推
$* 与 $@ 区别:
相同点:都是引用所有参数。
不同点:只有在双引号中体现出来。假设在脚本运行时写了三个参数 1、2、3,,则 " * " 等价于 “1 2 3”(传递了一个参数),而 “@” 等价于 “1” “2” “3”(传递了三个参数)。
小结:
$数字
- 脚本传参 命令行内容 传递到脚本的内部
/etc/init.d/network start - #脚本参数超过9个 脚本参数需要使用 ${10} ${11}
$ 与${}
表示状态变量
变量字串
- 对变量的内容 进行 替换 删除
变量子串 parameter表示变量
基础
${parameter} 取变量内容
${#parameter}
统计变量的长度 (多少个字
符)
截取
${parameter:1}
${parameter:1:2}
删除
${parameter#word} 删除
${parameter##word}
${parameter%word}
${parameter%%word}
替换
${parameter/找谁/替换为什么}
${parameter//找谁/替换为什
么}
shell运算符
Shell 和其他编程语言一样,支持多种运算符,包括:
算数运算符
关系运算符
布尔运算符
字符串运算符
文件测试运算符
原生bash不支持简单的数学运算,但是可以通过其他命令来实现,例如 awk 和 expr,expr 最常用。
expr 是一款表达式计算工具,使用它能完成表达式的求值操作。
例如,两个数相加(注意使用的是反引号 ` 而不是单引号 '):
两点注意:
表达式和运算符之间要有空格,例如 2+2 是不对的,必须写成 2 + 2,这与我们熟悉的大多数编程语言不一样。
完整的表达式要被 包含,注意这个字符不是常用的单引号,在 Esc 键下边。
下表列出了常用的算术运算符,假定变量 a 为 10,变量 b 为 20:
注意:条件表达式要放在方括号之间,并且要有空格,例如: [ a = = a== a==b] 是错误的,必须写成 [ $a == $b ]。
算数运算符详解
关系用算符
关系运算符只支持数字,不支持字符串,除非字符串的值是数字。
下表列出了常用的关系运算符,假定变量 a 为 10,变量 b 为 20:
布尔运算符
下表列出了常用的布尔运算符,假定变量 a 为 10,变量 b 为 20:
逻辑运算符
以下介绍 Shell 的逻辑运算符,假定变量 a 为 10,变量 b 为 20:
字符串运算符
下表列出了常用的字符串运算符,假定变量 a 为 “abc”,变量 b 为 “efg”:
文件测试运算符
linux文件
其他检查符:
- -S: 判断某文件是否 socket。
- -L: 检测文件是否存在并且是一个符号链接。
实例
linux计算方法
未完待续············