bash shell学习-shell script基础 (笔记)
A chain no stronger than its weakest link.
"一着不慎,满盘皆输"
一、什么是shell script
1、什么是shell script
简单来说,shell script(程序化脚本)是利用shell功能所写的一个“程序”,它拥有自己的语法特性
2、为什么要学shell script
对于一个初学者来说,我觉得就那么几个原因:
①连续命令单一化;
②简单的数据处理;
③简化常规的系统管理;
3、注意事项(重要!重要!重要!--重要的事情说三遍)
①命令的执行顺序是从上而下,从左而右地分析与执行;
②如果读取到一个Enter符号(CR),就尝试开始执行该行(串)命令;
③如果命令太长,可以使用\[Enter]来扩展至下一行;
④“#”可作为批注(注释),任何加在“#”后面的数据在执行时全部被忽略;
⑤命令、参数间的空白(包括Tab键)在执行时都会被忽略;
4、shell script的文件结构(重要!重要!重要!)
①第一行为#!/bin/bash,目的是声明这个script使用的shell名称;
②程序内容说明;
③主要环境变量和函数的声明;
④主程序部分;
⑤程序的执行结果;
5、养成良好的shell script编程习惯(重要!重要!重要!)
①功能(批注);
②版本信息(批注);
③作者和联系方式(批注);
④版权声明(批注);
⑤历史记录(批注);
⑥特殊命令应该用绝对路径的方式来执行;
⑦预先声明环境变量;
二、简单的shell script练习
1、几种常用的范例
①交互式脚本:用 read 命令获取用户输入作为变量内容;
②随日期变化的文件:利用date命令的执行结果作为文件名的一部分;
③简单的数值运算:shell script支持 +、-、*、/、%等运算符上的整数运算;
④数值运算的方法:假设a=1,b=2,现在要求a+b并赋值给c,那么可以这样: let c=a+b、c=$((a+b))或者c=$[ a + b ] ;
2、script的执行方式区别
①直接执行或者使用 bash name.sh 方式执行:子进程执行完之后,子进程内各项变量或操作将会结束而不传回到父进程中;
②利用 source name.sh 或者 . name.sh 的方式来执行:在父进程中执行;
三、测试语句
1、利用 test 测试,命令格式: test test_expr
2、利用 [] ,命令格式: [ test_expr ] ,使用中括号需要注意以下几点:
①在中括号[]内的每个组件都要用空格键来分隔;
②在中括号内的变量,最好都以双引号括起来;
③在中括号内的常量,最好都以单或双引号括起来;
3、关于 test_expr ,见下表
| 测试标志 | 代表意义 |
| 文件类型判断,如: test -d filename 表示 判断filename是否存在且是一个目录 | |
| -e | 文件名是否存在 |
| -f | 文件名是否存在且为文件(file) |
| -d | 文件名是否存在且为目录(directory) |
| -b | 文件名是否存在且为一个block device设备 |
| -c | 文件名是否存在且为一个character device设备 |
| -S | 文件名是否存在且为一个Socket文件 |
| -p | 文件名是否存在且为一个FIFO(pipe)文件 |
| -L | 文件名是否存在且为一个连接文件 |
| 文件权限检测,如: test -r filename 表示 判断filename是否可读(root权限例外) | |
| -r | 文件名是否存在且具有“可读”权限 |
| -w | 文件名是否存在且具有“可写”权限 |
| -x | 文件名是否存在且具有“可执行”权限 |
| -u | 文件名是否存在且具有“SUID”属性 |
| -g | 文件名是否存在且具有“SGID”属性 |
| -k | 文件名是否存在且具有“Sticky bit”属性 |
| -s | 文件名是否存在且为“非空白文件” |
| 两个文件之间的比较,如: test file1 -nt file2 表示 判断file1是否比file2新 | |
| -nt | (newer than)更新 |
| -ot | (older than)更旧 |
| -ef | 是否为同一文件,主要用于判定两个文件是否指向同一个inode |
| 整数比较,如: [ n1 -eq n2 ] 表示判断n1是否等于n2 | |
| -eq | (equal)相等 |
| -ne | (not equal)不相等 |
| -gt | (greater than)大于 |
| -lt | (less than)小于 |
| -ge | (greater than or equal)大于等于 |
| -le | (less than or equal)小于等于 |
| 字符串比较 | |
| -z string | 是否为空串 |
| -n string | 是否不是空串,-n 可省略 |
| str1 == str2 | 是否相等 |
| str1 != str2 | 是否不等 |
| 复合判定,如:[ n -ge '0' -a n -le '9' ] 表示 判断n是否大于等于0且小于等于9 | |
| -a | 与 运算符,都成立才成立 |
| -o | 或 运算符,一个成立就成立 |
| ! | 非 运算符,取反 |
4、shell script的默认变量
$: 脚本文件名;$,$,...,$i,第i个参数;
$#: 参数个数;$@:代表“ "$1"、"$2"、"$3"、...”,每个变量是独立的;$*:代表“ "$1c$2$3c..." ”,c为分隔符,默认为空格;
shift: 参数变量号码偏移,shift n 表示将所有变量的变量号码左移n位,变量计数始终从$1开始;
四、条件判断式
1、if ... then
if [ expr1 ]; then
dosomething
elif [ expr2 ]; then
dosomething
...
else
dosomething
fi
注意:条件表达式可以用 && 、|| 连接起来进行复合判断,作用与 -a、-o 一样
2、case ... esac
case $变量名 in
"var1")
dosomething
;;
"var2")
dosomething
;;
...
*)
dosomething
;;
esac
3、使用函数(function)
function fname()
{
dosomething
}
注意:函数的内置变量与shell script的默认变量类似
五、循环
1、while do done
while [ condition ]
do
dosomething
done
2、until do done
until [ condition ]
do
dosomething
done
3、for...do...done
for var in con1 con2 ...
do
dosomething
done
for ((初始值;限制值;执行步长)) --用于数值处理
do
dosomething
done
补充:使用 seq a b 可以生成a到b的连续序列(整数)
六、shell script的追踪与调试
用法:bash [-nvx] script.sh
参数:
-n :不要执行,仅查询语法问题
-v :在执行前,先将script的内容输出到屏幕上
-x :将使用到的script内容显示到屏幕上,最常用的参数
七、几个重要的命令(补充,持续更新...)
1、trap:信号处理
用法:trap cmd signal #在接收到signal信号后执行cmd命令
范例:trap rm tmpfile INT #接收到INT信号(Ctrl+C组合键引发)后删除tmpfile
2、find:查找文件
用法:find [path] [options] [tests] [actions]
功能:在 path 指定的目录下查找满足 options 和 tests 指定条件的文件,并执行 actions 指定的动作
options说明:
-depth #在查看目录本身之前先搜索目录的内容
-follow #跟随符号链接
-maxdepth N #最多搜索N层目录
-mount(或 -xdev) #不搜索其他文件系统中的目录 tests说明:
-atime N #文件在N天之前被最后访问过
-mtime N #文件在N天之前被最后修改过
-name pattern #文件名(不包括路径名)匹配提供的模式pattern,pattern必须用引号括起
-newer otherfile #文件比otherfile更新
-type c #文件类型为c,c是一个特殊类型,如d(目录)、f(普通文件)等
-user username #文件的拥有者是username指定的用户 还可以使用操作符来进行组合测试
! -not #测试取反
-a -and #与运算
-o -or #或运算 actions说明:
-exec command #执行一条命令,这个动作必须使用 \; 字符对来结束,常用!!!
-ok command #与-exec类似,但在执行前会针对每个要处理的文件,提示用户进行确认,也必须使用 \; 字符对来结束
-print #打印文件名
-ls #对当前文件使用命令ls
说明:{}是-exec或-ok命令的一个特殊类型参数,它将被当前文件的完整路径取代
补充:-exec结合多个命令。-exec参数每次只能直接执行单个命令,但是我们可以把多个命令写到一个script中,然后在-exec后将单个命令替换为执行script的命令,{}将作为script的参数传递给script
范例:find ./ -name "*.gch" -exec rm {} \; #在当前目录下递归查找文件名以 .gch 结尾的文件并删除他们
总结:shell的功能真的是很强大,刚开始学习就利用shell script快速地完成了很多操作,特别是用find命令来查找文件,屡试不爽啊!
bash shell学习-shell script基础 (笔记)的更多相关文章
- Shell学习——Shell分类:登录shell和非登陆shell 交互shell和非交互shell
1.从两个不同维度来划分,是否交互式,是否登录 2.交互式shell和非交互式shell 交互式模式:在终端上执行,shell等待你的输入,并且立即执行你提交的命令.这种模式被称作交互式是因为shel ...
- bash shell学习-shell基础 (笔记)
When you hoist the sails to cross the sea, you willride the wind and cleave the waves. "长风破浪会有时 ...
- 【shell】《shell学习指南》读书笔记
一.使用shell脚本 优点:脚本语言能够轻易处理文件与目录之间的对象,如把文件从所有目录拷贝到另一个目录 缺点:效率不如编译型语言 二.简单的脚本 1.查看现在系统有谁登录 $who 2.算出行数 ...
- Shell学习---Shell脚本的静态检查工具shellcheck
Shell脚本的静态检查工具shellcheck ubuntu下 apt install shellcheck ,即可安装shellcheck.写完shell脚本,记得用它检查一下,能给你点建议的.要 ...
- [转帖][Bash Shell] Shell学习笔记
[Bash Shell] Shell学习笔记 http://www.cnblogs.com/maybe2030/p/5022595.html 阅读目录 编译型语言 解释型语言 5.1 作为可执行程序 ...
- [Bash Shell] Shell学习笔记
1. Shell简介 Shell本身是一个用C语言编写的程序,它是用户使用Unix/Linux的桥梁,用户的大部分工作都是通过Shell完成的.Shell既是一种命令语言,又是一种程序设计语言.作为命 ...
- 菜鸟教程之学习Shell script笔记(上)
菜鸟教程之学习Shell script笔记 以下内容是,学习菜鸟shell教程整理的笔记 菜鸟教程之shell教程:http://www.runoob.com/linux/linux-shell.ht ...
- shell学习笔记汇总
1.shell脚本中函数使用 函数定义在前,调用在后,顺序反了就没有效果了.函数调用为:函数名 参数列表 函数内部通过以下变量访问函数的参数:shell脚本函数中: $0: 这个脚本的名字 $n: 这 ...
- shell学习笔记
shell学习笔记 .查看/etc/shells,看看有几个可用的Shell . 曾经用过的命令存在.bash_history中,但是~/.bash_history记录的是前一次登录前记录的所有指令, ...
随机推荐
- bzoj1978
朴素的算法是O(n2logn)观察这个算法,似乎很难在进行优化我们就要换一种思路考虑到一个数的约数总不是很多,穷举约数也是可以在O(sqrt(x))的时间内完成的并且注意到,能否继续往下选数,只在于最 ...
- Linux系统下用户行为审计
以下内容在RHEL 6.4下测试通过. 1.编写脚本Command_history.sh,生产历史命令记录文件,内容如下 #!/bin/bash [ -d /usr/lib/.cmdlog ] || ...
- linux下的webserver BOA及CGIC库的使用指南(转帖)
我把网页挂载到nfs 下面的文件中(需要新建一个文件www ),不过这样很方便! 安装过程 ====================================================== ...
- C#:ref和out的联系及区别
一:ref 关键字使参数按引用传递. 其效果是,当控制权传递回调用方法时,在方法中对参数所做的任何更改都将反映在该变量中.若要使用 ref 参数,则方法定义和调用方法都必须显式使用 ref 关键字. ...
- Android 子线程请求ASP.NET后台
首先定义布局文件,及点击事件 public class MainActivity extends Activity { private final int MSG_HELLO = 0; private ...
- android实现图片识别的几种方法
实现android图像识别的几种方法 点击这里下载第一种代码 最近完成了毕业设计,论文名为基于图像识别的移动人口管理系统.编写过程中学到了几种图像识别的技术,先写下来与大家分享. 第一种,直接使用免费 ...
- Linus:为何对象引用计数必须是原子的
Linus大神又在rant了!这次的吐槽对象是时下很火热的并行技术(parellism),并直截了当地表示并行计算是浪费所有人时间(“The whole “let’s parallelize” thi ...
- oGitHub 注册
GitHub 注册 要想使用 GitHub 第一步当然是注册 GitHub 账号: 1.首先打开 https://github.com/pricing 进行注册. 2.在打开的页面中点击「Sign u ...
- windows设置多长时间后自动关机 分类: windows常用小技巧 2014-04-15 09:35 230人阅读 评论(0) 收藏
分二步: 第一步:点击windows键,在"搜索程序和文件"的文本框输入:cmd 第二步:输入:shutdown -s -t (设置电脑一小时后自动关机) 备注: ...
- Android CountDownTimer 倒计时
摘自:http://www.cnblogs.com/over140/archive/2011/12/20/2294220.html 继承关系 public abstract class CountDo ...