bash 编程的主要应用还是在批命令上, 简化我们日常频繁的击键命令
可以自动化命令,最大限度减小击键。 bash 可以直接调用控制台命令
********************************************************************************
1. 批文件改名.例如:将当前目录下所有.bin 后缀文件改为.txt后缀文件********************************************************************************
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)