bash 编程应用及调试

bash 编程的主要应用还是在批命令上, 简化我们日常频繁的击键命令

可以自动化命令,最大限度减小击键。 bash 可以直接调用控制台命令

********************************************************************************

1. 批文件改名.例如:将当前目录下所有.bin 后缀文件改为.txt后缀文件
********************************************************************************
for a in `ls`; do mv $a ${a/bin/txt}; done
说明,把ls 列出的项读入到a 变量中, 我们来操作a 变量

********************************************************************************
2. bash 批量复制文件.
********************************************************************************
需要创建多个文件。就把一个基本文件使劲copy 吧。
$ cat 1.sh
#!/bin/bash
let i=2
while [ $i -lt 10 ]
do
        cp 1.c ${i}.c
        let i=$i+1
done

写这个程序是想展示一下。 逻辑表达式两边必须要有空格。
而赋值中的算术表达式则不能有空格。 数值比较用-lt, -gt 等。
也算bash script 的一个特征。

********************************************************************************

3. bash 算术运算

let i=0
while [ $i -lt 50 ]
do
	let i=$i+1
	if [ $(($i % 10)) -eq 0 ]; then
		echo i is $i
		echo is 10 multy...
	fi
done


4. 计算今天距离自己的生日还有几天

[hjj@hjj ~/work/cleants]$ cat birth.sh 
#!/bin/bash
#例子:编写shell脚本计算还有多少天是自己的生日?
read -p "Input your birthday (YYYYmmdd):" birthday
m=`date --date="$birthday" +%m` #得到生日的月day
d=`date --date="$birthday" +%d` #得到生日的日
y=`date +%Y` #得到当前时间的年
now=`date +%s` #得到当前时间的秒值
birth=`date --date="$y$m$d" +%s` #得到今年的生日日期的秒值
internal=$(($birth-$now)) #计算今日到生日日期的间隔时间
if [ $internal -lt 0 ]; then #判断今年的生日是否已过
	birth=`date --date="$(($y+1))$m$d" +%s` #得到明年的生日日期秒值
	internal=$(($birth-$now)) #计算今天到下一个生日的间隔时间
fi
echo "There is :$((internal/60/60/24)) days." #输出结果,秒换算为天

[hjj@hjj ~/work/cleants]$ 

5. m3u8 文件解析:

m3u8 文件是这样的格式. 现在要求down下m3u8文件,再依次循环下载内部的ts 文件

$ cat 0103_00_192168001125.m3u8
#EXTM3U
#EXT-X-TARGETDURATION:3
#EXT-X-MEDIA-SEQUENCE:3
#EXTINF:3
./0103_00_192168001125_3.ts
#EXTINF:3
./0103_00_192168001125_4.ts
#EXTINF:3
./0103_00_192168001125_5.ts

代码如下:供参考, 提供了对命令行参数处理,提供了对字符串的处理。

#!/bin/bash  -v
if [ $# -lt 1 ]; then
	echo $#;
	echo "Usage: $0 <m3u8_url>";
else
	rm *.m3u8*
	rm *.ts
	url=$1;
	echo url is $url;
	wget $url
	file=${url##*1688/};
	echo "file is $file"
	baseurl=${url%/*}
	echo "baseurl is $baseurl";
	content=`cat $file`
	echo "content is: $content"
	last=${content##*EXTINF:3}
	echo -e "----last is---\n$last"
	base=${last:4:21};
	echo "base is $base";
	v1=${last##*_};
	v2=${v1%%.*};
	echo "v is $v2";
	while [ 1 ]
	do
		url=$baseurl"/"$base$v".ts"
		echo "url is $url";
		wget $url;
		let v=$v+1
	done
fi

6. nm 的增强工具,可以输出c++的可读符号信息,代码如下:

#!/bin/bash
#nm 增强工具nmc++
#读取命令行参数
if [ $# -lt 1 ]; then
	echo $#
	echo "Usage $0 <file>"
else
#获取控制台输出信息
nm $1 |while read line
do
#	echo $line
#分析控制台信息
#bash 中使用awk 命令
	echo $line | awk '{
	for(i=1;i<=NF;i++) {
		printf $i " ";
#输出信息
		if($i~/_Z/){
			printf "\t"
#转换信息, awk 中使用shell 命令
			system("c++filt " $i)
		}
	}
}'
done
fi


7. bash 遍历所有命令行参数, 带路径copy 文件到指定目录

for i in $@; do echo $i; done
bash 取得程序输出. 反引号操作
将grep 到的所有.h, .cpp 文件copy
命令:
./enum.sh `find . -name "*.h" -or  -name "*.cpp"`
其中enum.sh 内容如下:
cat enum.sh
#!/bin/bash
for i in $@; do
    b=`basename $i`;
    p=`dirname $i`;
    p=${p:2}
    echo "cp $i  ~/pojie/monitor_all/$p";
    cp $i  ~/pojie/monitor_all/$p;
done

8. bash 输入10进制数, 输出10进制,16进制数据。

#!/bin/bash
help()
{
	echo "Description: input number, output decimal and hex";
	echo "Use exit or quit or ctrl-c to exit";
	echo "Usage: $0 <number>";
	exit 0;
}

if [ $# -eq 0 ]
then
help;
fi
printf "%d 0x%x\n" $1 $1

while read line
do
	if [ $line == exit -o $line == quit ]
	then
		exit 0;
	fi
	printf "%d 0x%x\n" $line $line
done


 bash 脚本的调试。

-n 选项,只显示不执行(与makefile 选项含义相一致), 现在被-D 选项替代了。

 -x -v 选项!     

-v 打印源代码行, -x 执行命令前打印命令和参数

-v  Print shell input lines as they are read.
-x  Print commands and their arguments as they are executed.

虽然不能单步执行,但强打印输出,也可一目了然。
read -n 1 ; 相当于加入了pause 命令,可以重点观察。

除了在脚本中设置,也可以设置bash 选项

set -o 显示选项
set -o -v 打开verbose 模式
set -o +v 关闭verbose 模式
set -o -x 打开调试echo 模式
set -o +x 关闭调试echo 模式


bash 调试工具: bashdb (命令行方式,类似gdb)

你可能感兴趣的:(bash 编程应用及调试)