Shell脚本入门
常用命令
参考命令 | ||
---|---|---|
cd |
bash |
vim |
mkdir |
ls |
ps |
top |
lsof |
` |
流程控制
if判断
if语法中,句式以if
开头以fi
结尾。if
后使用中括号来引用条件,中括号后使用英文分号 ;
结尾,并添加字符then
承接下一步具体命令。转折使用else
或者elif
字符,可以引用多个elif
添加判断。(中括号在shll中具有换行的作用)
单分支句式
1 | if [条件判断式];then |
多分支句式
1 | if [条件判断式];then |
case 语句
使用case句式也可以完成多分支判断.
case语句使用case开头esac结尾,变量 in 另开一行加右括号,每次判断都要以两个英文冒号结尾。其中星号指的是“其他条件”,等同于if判断中的else,指的是其他的所有情况。
case语句示例
1 | case $num in |
for循环
for
循环格式为:以for
开头,后使用双层小括号或者使用中括来包裹初始条件,循环控制条件以及变量变化。随后在第二行添加字符do
重起一行写执行的程序,最后以字符done
结尾。(在条件的外围,我们更推荐使用双重小括号来进行包裹而不是中括号,是用中括号来进行包裹的时侯在中括号内部的两侧都要添加一个空格,在双重小括号中则不需要考虑留出空格,直接写条件即可)
((sum +i))
和[ $sum + $i ]
是一样的效果
1 | for ((初始值;循环控制条件;变量变化)) |
案例一
要求使用for循环来打印九九乘法表
1 | !/bin/bash |
输出
1 | root@ubuntu:~/shell/if# bash 2.sh |
案例二
题目:要求计算到用户输出数字的累加和
代码 1 | 代码 2 |
---|---|
#! /bin/bash for ((i=1;i<=$1;i++)) do sum=$((sum + um)) done echo $sum |
#! /bin/bash for ((i=1;i<=$1;i++) do sum=$[ $num + $i ] done echo $sum |
输出
1 | root@ubuntu:~/shell/if# bash 3.sh 100 |
while循环
while循环中使用while开头,后使用中括号(中括号内左右都要有一个空格)包裹判断式。随后使用do和done包裹执行的命令
注意:在[]中只能使用比较符号,例如-le,-gt等。在(())中只能使用数学符号,<>+= 等符号
1 | while [ 条件判断式 ] |
案例
题目:使用while循环,计算1-100整数的累加和
1 |
|
read读取命令
使用语法: read (选项) (参数)
例如
1 | read -t 6 -p "please input your answer" answer |
选项 | 释义 |
---|---|
-p | 读取输入的内容 |
-t | 等待的时间(超时则执行会退出) |
函数
系统函数
- basename
- dirname
basename
用于打印当前文件的名字dirname
用于打印当前文件的路径部分
自定义函数
基本语法
1 | function function_name() |
案例
题目:编写一个函数add
,接受两个参数,并返回它们的和。
1 | #!/bin/bash |
1 | root@ubuntu:~/shell/if# bash 5.sh |
题目:编写一个factorial
函数,计算n的阶乘(n!)
1 | !/bin/bash |
1 | please input a number:4 |
归档文件
1 | ! /bin/bash |
1 | root@ubuntu:~/shell/if# bash 7.sh /root/shell/if |
正则表达式
使用特殊字符
^
匹配一行的开头字母1
2
3cat /root/shell/bash.sh | grep -n ^echo
在文件bash.sh中匹配以echo字符开头的行,-n为列出所在的行号$
匹配一行的结束
1 | cat /root/shell/bash.sh | grep -n echo$ |
.
匹配一个字符
1 | cat /root/shell/bash.sh | grep -n r..t |
*
匹配重复字符
1 | cat /root/shell/bash.sh | grep -n ro.t |
[]
匹配字符&范围1
2
3[a,b] [2,6]
用于匹配列表中的字符1
2[1-9] 或 [a-z]
用于匹配1-9或者a-z之间的一个字符1
2[1-9]* [a-z]*
用于匹配范围内任意长度的字母或者字符串1
2[a-g,h-k]-
用于匹配a-g或者h-k间的任意字符
文本处理
cut
默认分隔符为制表符,也就是四个空格
基本用法
1 | cut [选项参数] filename |
选项参数 | 功能 |
---|---|
-f |
列号,提取第几列 |
-d |
分隔符,按照指定分隔符分割列,默认分隔符为制表符\t |
-c |
按字符进行切割,后加数字表示取第几列 |
案例解析
案例1:
1 | cut -d " " -f 2 file_name.txt |
案例二:
1 | cut -d " " -f 2,3 file_name.txt |
使用cut
命令,-d
指定分隔符为空格 -f
指定截取的列数为第二第三列
案例三:
1 | cat /etc /passwd | grep bash$ | cut -d ":" -f 1,6,7 |
截取/etc/passwd
目录下以bash
结尾的行,并且只截取信息中以:
作为分隔符隔开的内容,且只取第1
、6
、7
三行的数据
案例四
1 | echo $PATH | cut -d :"" -f 3- #执行该代码 |
awk
基本用法:
1 | awk 参数 ‘/条件/{执行的命令}’ 被处理的文件 |
参数 | 功能 |
---|---|
-F |
指定使用的分隔符 |
-v |
赋值一个用户自定义变量 |
案例一
找出root用户工作的目录
1 | cat /etc/passwd | grep ^root | cut -d ":" -f 7 |
1 | cat /etc/passwd | awk -F ":" '/^root/{print $7}' |