adinxu
by adinxu
1 分钟 阅读用时

分类

标签

bash编程学习

先简单写一点,以后在整理
记性不好,看完就忘…

sh bash脚本编程调试

当我们写c或其他程序时,都有调试这一技能,调试可以说是很重要的了…能节约你的时间,shell脚本也有调试…
两种方式–执行时添加参数 脚本里添加参数

参数 含义

|——

-n 不执行脚本,仅检查是否有语法错误 -v 执行脚本前,把脚本内容输出到屏幕 -x 将执行时的内容输出到屏幕

假如现在要执行的脚本叫做test.sh,那么
bash -n test.sh可以检查脚本语法是否有错,无错误没有任何输出,echo $?可以得0.同理,其他的参数也一样.
另外这些参数可以组合使用–但是,当加入n后,脚本就不会执行了,所以-nxx将不会起作用…

脚本第一行一般都是

#!/bin/bash
...#脚本内容
...

这种指定哪个解释器执行脚本的语句,这样,参数可以跟在后面:

#!/bin/bash -n
...#脚本内容
...

这样就可以检查语法错误了
另外还可以针对某一段执行,如:

#!/bin/bash

...#段1
...
set -n#开始检查语法
...#段2
...
set +n#停止检查

这样就可以只针对段2检查语法错误,-n开始,+n停止,另外的x,v也是一样

运算符

今天看脚本把&&   和c里面的逻辑运算符混了…
符号 意义

|——

cmd1&&cmd2 cmd1执行成功(返回0),cmd2才执行 cmd1||cmd2 cmd1执行成功(返回0),cmd2不执行

这里说的返回0,是一个环境变量$?,总之不能跟逻辑与或混了…
bash支持的运算符如下:

变量

命令 意义

|——

read 从键盘读取变量值 array 数组 declare 声明变量类型 echo $var 查看变量内容 unset $var 取消设定变量 set 查看所有变量 export var 将自定义变量变为环境变量,也就是子程序可以调用此变量了 `注1`

注1:source或.执行脚本即当前shell执行,不是在子程序里执行,可以做到立即生效的作用
比较有用的几个环境变量:

变量 意义

|——

HOME 代表用户的家目录 SHELL 目前正在使用的shell PATH 可执行文件搜索路径 LANG 语言变量 RANDOM 随机数变量 PS1 提示字符的设定 $ 本shell 的 PID ? 上个执行指令的回传值 OSTYPE, HOSTTYPE, MACHTYPE 操作系统、主机、机器类型

关于变量内容的操作

形式 意义

|——

${vat#str} 从变量首开始删除,找最短符合删除 ${vat##str} 从变量首开始删除,找最长符合删除 ${vat%str} 从变量尾开始删除,找最短符合删除 ${vat%%str} 从变量尾开始删除,找最长符合删除 ${var/oldstr/newstr} 找到的第一个被替换 ${var//oldstr/newstr} 找到的全部被替换 var=${str-expr} 变量未定义赋值,否则将str赋给var var=${str:-expr} 变量未定义或为空赋值,否则将str赋给var var=${str+expr} 变量若定义则赋值,否则将str赋给var var=${str:+expr} 变量非空赋值,否则将str赋给var var=${str=expr} 若变量str未定义,设定变量str,将值赋给str和var,否则将str赋给var var=${str:=expr} 变量未定义或为空,将值赋给str和var,否则将str赋给var var=${str?expr} 变量不存在报错,否则将str赋给var var=${str:?expr} 变量不存在或为空报错,否则将str赋给var

一些有用的管道命令

命令 意义

|——

cut 使用某种格式从文件中截取每一行中的某一字段 grep 利用正则表达式分析一行数据 sort 根据制定格式对行排序 uniq 去重 wc 统计相关字、行、字符数 tee 双向重导向,可以重定向输出到文件的同时依旧输出到屏幕 tr 文字替换 col tab替换为空格 jion 归并两个文件中相同的部分 paste 将两个文件贴在一起,以tab分隔 expand tab转空格 split 分隔文件 xargs 参数代换 sed 流编辑,可直接编辑文件;添加多行时要以`\`分隔;替换: `sed 's/要被取代的字符串/新的字符串/g'`多用于以行为单位的处理 printf 格式化打印 awk 字段处理 diff 比较文件差异 cmp 对比文件(以字节为单位) patch 根据diff修订文件 pr 显示时加入标题页码

:

脚本编写

**test命令 与判断符号 [ ]**

注意:判断符号里面都要有两个空格分隔如[空格-e filename空格]
判断符有以下特点:

  1. 在中括号 [] 内的每个组件都需要有空格键来分隔;1. 在中括号内的变量,最好都以双引号括号起来;1. 在中括号内的常量,最好都以单或双引号括号起来; **条件判断**

原型:

 if[ expr1];then
 ...
 elseif[expr2];then
 ...
 elseif[exprn];then
 ...
 else
 ...
 fi


原型

case $var in
	变量内容1)
	...
	;;
	变量内容2)
	...
	;;
	*)
	...
	;;
easc

最后的*)相当于switch里的default

**循环**

原型:

while [ condition ]
do
程序段落
done


until [ condition ]
do
程序段落
done


for var in con1 con2 con3 ...
do
程序段
done 
#作为循环选取,可使用`$(seq 1 100)`或bash内建的{1..100}来完成1
#到100序列,字母也可以如{a..g}


for (( 初始值; 限制值; 执行步阶 ))
do
程序段
done

分号

在Linux bash shell中,语句中的分号一般用作代码块标识
比如

if [ -f requirements.txt ]; then echo ok; fi

if [ -f requirements.txt ]
then echo ok;
fi

效果是一样的。如果你在shell里面按行依次输入命令,然后查看命令历史,看到的也是一行的以分号分割的命令。