概述:
Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁。Shell 既是一种命令语言,又是一种程序设计语言。
Shell 是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访问操作系统内核的服务。
Ken Thompson 的 sh 是第一种 Unix Shell,Windows Explorer 是一个典型的图形界面 Shell。
Shell 脚本(shell script),是一种为 shell 编写的脚本程序。
业界所说的 shell 通常都是指 shell 脚本,但读者朋友要知道,shell 和 shell script 是两个不同的概念。
由于习惯的原因,简洁起见,本文出现的 "shell编程" 都是指 shell 脚本编程,不是指开发 shell 自身。
Shell 编程跟 java、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)
一:执行解释器
1.简介
Shell 编程跟 java、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 程序。
2.
3.
二:第一个脚本
1.用命令生成第一个脚本
echo -e '#!/bin/bash echo "hello world"' > hello.sh
会在当前文件夹生成 hello.sh
里面是:
#!/bin/bash
echo "hello world"
这个脚本就是打印hello world
2.修改脚本权限
至于权限,另外补课吧
这个脚本是没有权限运行的,还是一条命令,给它权限。
chmod +x hello.sh
3.运行这个脚本
一般在linux下,我使用./来运行脚本
./hello.sh
还有另一种运行方式是指定解释器来运行,请自己测试
例: /bin/bash hello.sh
练习的话,vi用着真不爽,保存再上传也不爽。
http://www.compileonline.com/execute_bash_online.php
这个在线的练习就比较爽了。左边写完shell脚本,点击上面的Execute,右边就出结果了。
4.脚本解释
这个脚本其实就两行
#!/bin/bash
echo "hello world:
也就是程序员的hello world。
第一行,声明解释器 使用/bin/bash
第二行,输出 hello world
三:shell变量简介
1.变量类型运行shell时,会同时存在三种变量:
1) 局部变量 局部变量在脚本或命令中定义,仅在当前shell实例中有效,其他shell启动的程序不能访问局部变量。
2) 环境变量 所有的程序,包括shell启动的程序,都能访问环境变量,有些程序需要环境变量来保证其正常运行。必要的时候shell脚本也可以定义环境变量。
3) shell变量 shell变量是由shell程序设置的特殊变量。shell变量中有一部分是环境变量,有一部分是局部变量,这些变量保证了shell的正常运行
我们一般只使用局部变量
2.shell变量(字符串)
#!/bin/bash my_name=jack my_full_name='jack adam' my_full_name_1="jack adam" my_full_name_2="jack adam" echo $my_name echo $my_full_name echo -e $my_full_name echo $my_full_name_1 echo $my_full_name_2
跑跑试试,很多教程都说什么单引号双引号……我在fedora上测试的,效果一样,要在echo -e 才会转义 .
3.shell变量(数字)
#!/bin/bash j=10 for((i=1;i<=j;i++)) do echo "这是第 $i 次调用" done
echo $j
跑跑试试,定义数字变量也很简单。j=10,就定义了变量
4.shell变量(数组)
#!/bin/bash our_name=( jack rose james tom jerry ) my_friend_name=(rose james tom jerry) echo $our_name echo ${our_name[1]} echo ${our_name[2]} echo ${our_name[@]} echo ${my_friend_name[@]}
定义数组可以用换行,也可以用空格,用下标加花括号的方式引用。
注意,变量名和等号之间不能有空格,这可能和你熟悉的所有编程语言都不一样。同时,变量名的命名须遵循如下规则:
命名只能使用英文字母,数字和下划线,首个字符不能以数字开头。
中间不能有空格,可以使用下划线(_)。
不能使用标点符号。
不能使用bash里的关键字(可用help命令查看保留关键字)。
四:shell变量字符串
1.
2.
3.
五:shell变量数字
1.
2.
3.
六:shell变量数组
1.
2.
3.
七:shell流程控制
1.if else fi
a=1 b=1 if a=b then echo '==' else echo '!=' fi if a=b then echo '!=' else echo '==' fi
else 可以省掉,fi表示if结束,不能省。
2.for
3.while while true
4.until
5.case
6.case
5.case
5.case
八:Shell 基本运算符
Shell 和其他编程语言一样,支持多种运算符,包括:
- 算数运算符
- 关系运算符
- 布尔运算符
- 字符串运算符
- 文件测试运算符
1.算术运算符
2.关系运算符
3.布尔运算符
4.逻辑运算符
5.字符串运算符
6.文件测试运算符
文件测试运算符用于检测 Unix 文件的各种属性。
属性检测描述如下:
操作符 | 说明 | 举例 |
---|---|---|
-b file | 检测文件是否是块设备文件,如果是,则返回 true。 | [ -b $file ] 返回 false。 |
-c file | 检测文件是否是字符设备文件,如果是,则返回 true。 | [ -c $file ] 返回 false。 |
-d file | 检测文件是否是目录,如果是,则返回 true。 | [ -d $file ] 返回 false。 |
-f file | 检测文件是否是普通文件(既不是目录,也不是设备文件),如果是,则返回 true。 | [ -f $file ] 返回 true。 |
-g file | 检测文件是否设置了 SGID 位,如果是,则返回 true。 | [ -g $file ] 返回 false。 |
-k file | 检测文件是否设置了粘着位(Sticky Bit),如果是,则返回 true。 | [ -k $file ] 返回 false。 |
-p file | 检测文件是否是有名管道,如果是,则返回 true。 | [ -p $file ] 返回 false。 |
-u file | 检测文件是否设置了 SUID 位,如果是,则返回 true。 | [ -u $file ] 返回 false。 |
-r file | 检测文件是否可读,如果是,则返回 true。 | [ -r $file ] 返回 true。 |
-w file | 检测文件是否可写,如果是,则返回 true。 | [ -w $file ] 返回 true。 |
-x file | 检测文件是否可执行,如果是,则返回 true。 | [ -x $file ] 返回 true。 |
-s file | 检测文件是否为空(文件大小是否大于0),不为空返回 true。 | [ -s $file ] 返回 true。 |
-e file | 检测文件(包括目录)是否存在,如果是,则返回 true。 | [ -e $file ] 返回 true。 |
#!/bin/bash file="/root/hello.sh" if [ -r "/root/hello.sh" ] then echo "文件可读" else echo "文件不可读" fi if [ -w $file ] then echo "文件可写" else echo "文件不可写" fi if [ -x "/root/hello.sh" ] then echo "文件可执行" else echo "文件不可执行" fi if [ -f "/root/hello.sh" ] then echo "文件为普通文件" else echo "文件为特殊文件" fi if [ -d "/root/hello.sh" ] then echo "文件是个目录" else echo "文件不是个目录" fi if [ -s "/root/hello.sh" ] then echo "文件不为空" else echo "文件为空" fi if [ -e "/root/hello.sh" ] then echo "文件存在" else echo "文件不存在" fi
九:sed
-i 是指替换文件,保存
1.用sed 替换整行
sed -i '/mengqingbo/c lanqiuxiaozi="FALSE"' config.json
替换包含mengqingbo的整行为lanqiuxiaozi="FALSE"
2.用sed 替换字符串
sed -i "s/old_uuid/new_uuid/g" config.json
替换old_uuid为new_uuid
3.用sed 替换指定字符串后的未知字符串
目标为: "id": "e5b2b5f6-de74-4740-87d3-3ad0a52b5be8",
替换为: "id": "123456789",
sed -i 's/("id": ").*/1'"123456789"'",/g' config.json
4.在某行的前一行或后一行添加内容
#匹配行前加
sed -i '/allow 361way.com/iallow www.361way.com' the.conf.file
#匹配行前后
sed -i '/allow 361way.com/aallow www.361way.com' the.conf.file
而在书写的时候为便与区分,往往会在i和a前面加一个反加一个反斜扛 。代码就变成了:
sed -i '/2222222222/a3333333333' test.txt
sed -i '/2222222222/i3333333333' test.txt