之前由于自己需要编写大量的xml文件,所以就写了这个脚本,本人不会写脚本,通过这次就学习了脚本的写法,然后记录在这以便随时补充和学习shell脚本的内容,并通过该脚本拓展一下shell中的很多语法,并记录一下awk和tr命令的使用,其他像sed,grep等以后用到时在补充吧
#!/bin/bash
fn=htlm.xml //shell编程中“=”两边不允许出现空格
echo "<html>" >> ${fn} //fn变量引用时要可以$fn也可以使用${fn}
echo "<head>" >> ${fn}
if [ $# -ne 1 ]
then
echo "please input file row(column) number"
exit
fi
for i in $(seq 1 $1)
do
cnt=$i
label=`awk -vnvar="$cnt" '{if(NR == nvar) {print $1}}' tmp.xml`
value=`awk -vnvar="$cnt" '{if(NR == nvar) {print $2}}' tmp.xml`
echo "${label} ${value}"
echo "<${label}>${value}</${label}>" >> ${fn}
done
echo "</head>" >> ${fn}
echo "</html>" >> ${fn}
tmp.xml文件,用来输入key value对
title csdn
style 3
link a
div 3
效果展示
<html>
<head>
<title>csdn</title>
<style>3</style>
<link>a</link>
<div>3</div>
</head>
</html>
特殊变量:
$* 和 $@ 的区别
$* 和 $@ 都表示传递给函数或脚本的所有参数,不被双引号(" “)包含时,都以”$1" “
2
"
…
"
2" … "
2"…"n” 的形式输出所有参数。
但是当它们被双引号(" “)包含时,”$*" 会将所有的参数作为一个整体,以"$1 $2 … n " 的形式输出所有参数; " n"的形式输出所有参数;" n"的形式输出所有参数;"@" 会将各个参数分开,以"$1" “ 2 " … " 2" … " 2"…"n” 的形式输出所有参数。
操作符:
“=~” 正则匹配,用来判断其左侧的参数是否符合右边的要求,如果匹配则为真(返回0),不匹配则为假(返回1)。
if语法:
if [ expression ] //在expression两端是要有空格的,以上的操作符内容可运用在这里
then
expression
else
expression
fi
for语法:
for i in $(seq 1 10) //for in $(seq 1 2 10): 1起始,2步长,10终点;for ((i = 0; i < 10; i++)) ;for i in 1 2 3 4;for str in "w er t" "a w t"
do
expression //里面可以使用continue,break语句
done
awk使用:
使用man手册查看
gawk [ POSIX or GNU style options ] [ – ] program-text file
例子:
awk '/myhome.html/ { system("nmap " $1 ">> logdir/myhome.html") }'
awk '{ sum += $1 }; END { print sum }' file
awk -F: '{ print $1 }' /etc/passwd
用到的-F和-v使用的最多,在文件shell脚本中在给awk命令传入变量时总是失败,于是找到了-v参数,然后如脚本程序中使用
awk -vnvar=“$cnt” ‘{if(NR == nvar) {print $2}}’ tmp.xml, 使用-v将cnt变量给了nvar,nvar在awk程序中使用,即是cnt值
tr使用:
tr [OPTION]… SET1 [SET2]
-d, --delete: tr -d ';'删除分号
其它的使用的方式没有用过,用时man手册
截图来源
http://c.biancheng.net/cpp/shell/