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,是一个环境变量$?,总之不能跟逻辑与或混了…

变量

命令 意义
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 显示时加入标题页码

:

  • awk 的指令间隔:所有 awk 的动作,亦即在 {} 内的动作,如果有需要多个指令辅助时,可利用分号;间隔, 或者直接以 [Enter]
    按键来隔开每个指令
  • 逻辑运算当中,如果出现是否等于的情况,则务必使用两个等号==
  • 格式化输出时,在 printf 的格式设定当中,务必加上 \n ,才能进行分行!
  • 与 bash shell 的变量不同,在 awk 当中,变量可以直接使用,不需加上 $ 符号。

脚本编写

test命令 与判断符号 [ ]

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

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

条件判断

原型:

 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)