shell学习
1、shell的执行过程
读入命令,解析命令参数,fork子进程
子进程:执行execve跟换进程映像,执行命令对应的可执行文件,退出让出cpu并向父进程报告
父进程:若命令中无&符,则等待子进程中止,若有则仅需执行终端进程,等待命令输入
2、shell变量
shell变量是有类型的,一般有整型(整数)、数值型(小数)、字符串。
$为变量替换符,${param}与$param,功能一样。推荐使用加{},应为方便程序识别变量
3、shell字符串
单引号字符串的限制:
- 单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的;
- 单引号字串中不能出现单独一个的单引号(对单引号使用转义符后也不行),但可成对出现,作为字符串拼接使用。
双引号的优点:
- 双引号里可以有变量
- 双引号里可以出现转义字符
字符串提取:
以下实例从字符串第 2 个字符开始截取 4 个字符:
string="runoob is a great site"
echo ${string:1:4} # 输出 unoo
4、shell判断
If [expression]; then
Statements
Fi
或者
If [expression]; then
Statements
Else
Statements
Fi
对字符串、数值判断操作
对应的操作 |
整数操作 |
字符串操作 |
相同 |
-eq |
= |
不同 |
-ne |
!= |
大于 |
-gt |
> |
小于 |
-lt |
< |
大于或等于 |
-ge |
|
小于或等于 |
-le |
|
为空 |
|
-z |
不为空 |
|
-n |
对文件的判断
运算符 |
含义( 满足下面要求时返回 TRUE ) |
-e file |
文件 file 已经存在 |
-f file |
文件 file 是普通文件 |
-s file |
文件 file 大小不为零 |
-d file |
文件 file 是一个目录 |
-r file |
文件 file 对当前用户可以读取 |
-w file |
文件 file 对当前用户可以写入 |
-x file |
文件 file 对当前用户可以执行 |
-g file |
文件 file 的 GID 标志被设置 |
-u file |
文件 file 的 UID 标志被设置 |
-O file |
文件 file 是属于当前用户的 |
-G file |
文件 file 的组 ID 和当前用户相同 |
file1 -nt file2 |
文件 file1 比 file2 更新 |
file1 -ot file2 |
文件 file1 比 file2 更老 |
5、Shell脚本中$0、$?、$!、$$、$*、$#、[email protected]等的意义
变量说明
$$
Shell本身的PID(ProcessID)
$!
Shell最后运行的后台Process的PID
$?
最后运行的命令的结束代码(返回值)
$-
使用Set命令设定的Flag一览
$*
所有参数列表。如"$*"用「"」括起来的情况、以"$1 $2 … $n"的形式输出所有参数。
所有参数列表。如"[email protected]"用「"」括起来的情况、以"$1" "$2" … "$n" 的形式输出所有参数。
$#
添加到Shell的参数个数
$0
Shell本身的文件名
$1~$n
添加到Shell的各参数值。$1是第1参数、$2是第2参数…。
脚本举例
我们先写一个简单的脚本,执行以后再解释各个变量的意义
# touch variable
# vi variable
脚本内容如下:
#!/bin/sh
echo "number:$#"
echo "scname:$0"
echo "first :$1"
echo "second:$2"
echo "argume:[email protected]"
保存退出
赋予脚本执行权限
# chmod +x variable
执行脚本
# ./variable aa bb
number:2
scname:./variable
first: aa
second:bb
argume:aa bb
结果分析
通过显示结果可以看到:
$# 是传给脚本的参数个数
$0 是脚本本身的名字
$1是传递给该shell脚本的第一个参数
$2是传递给该shell脚本的第二个参数
[email protected] 是传给脚本的所有参数的列表