简介
- Shell是用户与内核进行交互操作的一种接口,目前最流行的Shell称为bash Shell
- Shell也是一门编程语言<解释型的编程语言>,即shell脚本
- 一个系统可以存在多个shell,可以通过cat /etc/shells命令查看系统中安装的shell,不同的shell可能支持的命令语法是不相同的
变量
- 输出变量的值
- echo $JAVA_HOME
- 定义变量
- 变量=值(例如STR=abc)
- 等号两侧不能有空格
- 变量名称一般习惯为大写
- 双引号和单引号有区别,双引号仅将空格脱意,单引号会将所有特殊字符脱意
- 撤销变量
- A=10
- unset A
- 声明静态变量(不能unset)
- readonly B=20
- 提升为全局变量(仅在当前进程和子进程有效)
- export JAVA_HOME=/root/apps/jdk1.8.0_40
- 将命令的返回值赋给变量
- A=`ls -la` 反引号,运行里面的命令,并把结果返回给变量A
- A=$(ls -la) 等价于反引号
- 特殊变量
- $? 表示上一个命令退出的状态(0表示成功执行)
- $$ 表示当前进程编号
- $0 表示当前脚本名称
- $n 表示n位置的输入参数(n代表数字,n>=1)
- $# 表示参数的个数,常用于循环
- $*和$@ 都表示参数列表
- 注:加上双引号,
"$*"
会将所有的参数作为一个整体,以"$1 $2 … $n"
的形式输出所有参数;"$@"
会将各个参数分开,以"$1" "$2" … "$n"
的形式输出所有参数
- 变量的范围
- export A=1 在自己的Shell进程及其子进程有效
- A=1 只对自己所在的Shell进程有效
- script.sh 在当前登录的Shell进程中
source script.sh
时,脚本中定义的变量也会进入当前登录的进程
运算符
- 格式
- expr m + n
- 注:expr运算符间要有空格
- 实例演示(2+3)x4
- expr `expr 2 + 3` \* 4
- A=$(expr `expr 2 + 3` \* 4)
流程控制
for循环
第一种
12345678for N in 1 2 3doecho $Ndonefor N in 1 2 3;do echo $N;donefor N in {1..3};do echo $N;done第二种
123456for ((i = 0; i <= 5; i++))doecho "welcome $i times"donefor ((i = 0; i <= 5; i++)); do echo "welcome $i times"; done
while循环
- 第一种12345678910111213while truedoecho $Adonewhile true;do echo $A;donei = 1while ((i<=3))doecho $ilet i++done
case条件语句
- 格式12345678910case $1 instart)echo "starting";;stop)echo "stoping";;*)echo "default"esac
read命令
- read -p(提示语句)-n(字符个数) -t(等待时间)
- read -p “please input your name: “ name
if判断
- 语法12345678910read -p "请输入姓名:" NAMEif [ $NAME=root ]thenecho "hello"$rootelif [ $NAME=bob ]thenecho "hi"$rootelseecho "SB"fi
注:if和[]之间以及[]内都必须要有空格
- 判断语句格式
[ 1 -eq 2 ] && echo “ok” || echo “no” - 常见判断条件
- = 字符串比较
- -lt 小于
- -le 小于等于
- -eq 等于
- -gt 大于
- -ge 大于等于
- -ne 不等于
- -r 有读的权限
- -w 有写的权限
- -x 有执行的权限
- -f 文件存在并且是一个常规文件
- -s 文件存在且不为空
- -d 文件存在并且是一个目录
- -b 文件存在并且是一个设备文件
- -L 文件存在并且是一个链接文件
自定义函数
- 声明的三种方式
- function start()
- function start
- start()
实例
1234567function fsum(){return $(($1+$2));}read -p "please input two num: " a bfsum $a $b;echo $?;注意点
- 必须在调用函数地方之前,先声明函数,shell脚本是逐行运行。
- 函数返回值,只能通过$?系统变量获得。加:return返回指定值,如果不加,将以最后一条命令运行结果,作为返回值。 return后跟数值n(0-255)
脚本调试
- sh -vx xxx.sh
- 在脚本中增加set -x
高级命令行文本处理工具
cut
- 格式
- cut -d ‘分隔符’ -f fileds 用于有特定分隔字符
- cut -c 字符区间 用于排列整齐的信息
- 选项与参数
-d:后面接分隔符与-f一起使用
-f:用-d将一段信息分割成多段,用-f取出第几段
-c:以字符的单位取出固定字符区间 - 实例
取出第3个和第五个路径
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/apps/jdk1.8.0_40/bin:/root/binecho $PATH | cut -d ':' -f 3,5
结果:/usr/sbin:/root/apps/jdk1.8.0_40/bin
sort
- 格式
sort -[fbMnrutk] [file or stdin] - 选项与参数
-f:忽略大小写差异
-b:忽略最前面的空格部分
-M:以月份的名字来排序
-n:使用数字排序(默认是字符)
-r:倒序
-u:就是uniq,去掉重复值
-t:分隔符,和-k一起使用
-k:以指定区间的值来排序 - 实例
cat /etc/passwd | sort -t ':' -k 3nr
wc
- 格式
wc -[lwm] - 选项与参数
-l:仅列出列
-w:仅列出多少字(英文单词)
-m:多少字符 - 实例
wc -l /etc/passwd
sed
- 简介
sed 是一种在线编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有 改变,除非你使用重定向存储输出。 - 命令(具体使用参考相关手册)
- 删除:d
- 替换:s
- 多点编辑:e
- 从文件读入:r
- 写入文件:w
- 追加:a
- 插入:i
- 下一个:n
- 变形:y
- 退出:q
- 保持和获取:h和G
- 保持和互换:h和X
- 脚本
Sed脚本是一个sed的命令清单,启动Sed时以-f选项引导脚本文件名。Sed对于脚本中输入的命令非常挑剔,在命令的末尾不能有任何空白或文本,如果在一行中有多个命令,要用分号分隔。以#开头的行为注释行,且不能跨行。
awk
- 简介
awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大。简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各种分析处理。 - 语法
具体功能十分强大,awk编程内容极多,更多请参考http://www.gnu.org/software/gawk/manual/gawk.html
最后更新: 2020年07月27日 03:48
原始链接: https://www.lousenjay.top/2018/08/09/Shell编程(CentOS7)/