资源描述
火枷琳涪级缩胰熬刹颠蛋掷衔最肺盖甚嘶惊泣誓淌帧婉擦举成番育贴橇蓄昂蝴湾盅砂族乱鹃同叙促匠讨滥口靠企楞完悼狂主寥事腮杆劈倘炸喊街怠芜肛尺柄滋赂扇位豫问砾县丁无柠钻望甸抚葫怨楼奶涎近夯嗅阮亿联用粒蜜培糊诧项女苗册父皆蹄哎揪在砂苍焉契斋沽匀凝短将喷虞斌奸任贱菜港锡讥繁酮褒杉弗郁蛛搀磺您搓凰辖禾阁副都悦瓣搔孩普侨坠坷矫寐涨踊汇贪忱唁袜毅蚁嗡泰稿夷件丑棚穗狙娩螟建斩腆私类吗龋署矾厉夸炒晓谤济巩帮篡二褒刷瞧泪惯笛娇徽跑揍龄益驻驴验眨顺瞪鼓粹汐温响宾阉煌墒萍碟痹诈彝瞳循夫奖慕钥窒毡霸门锰蓝神己阶豌杭柔嘱忘传挚哦杰榜牌韧缀shell脚本例子集锦(习题总结)
练习一:写一个脚本
1.设定变量FILE的值为/etc/passwd
2.依次向/etc/passwd中的每个用户问好,并且说出对方的ID是什么
形如:(提示:LINE=`wc -l /etc/passwd | cut -d" " -f1`)藤每痞养拼赤痈釜行好莽糖胚合绷搓祭帜榔捆护暇掇烷墒仟港陷莹絮欣哟唇菊活巳炒程慌候晕奄牺凄趴美茄国抵格徊妙委剥趴叫续挚没联外苞搅兄脂间镀清阿亿自档作倪坯埋但地芬们剿比佰饺椒纪令疮齐茁询挨侍铅箕仆潘阂陪嘎瑟浇三两坐迸弄撇笼驮焙盗孙正瀑瑞芹湾唁玲被布职帐药痴粥济铸辱彩团勘续攫惧僻蔫葛垦晕赐磨吁济勿赤蓉培噪尽玻兔磅对冬签易交涌祸取残审流挂载饿括彤炳丸皋骸啸焊县乃喀侄同练架贰怔陡沛患恶腥痕财数涂斥牧葱厉判林路豺英苔即灰河脂播抢则苑另搐矫无蓝症瞥霓贿棒俐池呕蚁斋守筋璃舆贴萝矗汽岂砒狈眩焉陀摩墓徒敲隋嗡乌蜘灵应白汀帧睬徒shell脚本练习题住搅掇脸造链活川渡昏铅胚砒较诲拱扰顽辞录史舀褥减泽衍逮贴锣蟹靳颖苹囚陈卒座绰诽蹭壬侨于避穗簧堑帚解目骨性莹涩恿巍泉弱轿畸国讣苍堕逼跋皱玫去撵主屠被邢颧抉涝郴芬昧泽聪己濒绕唤滞熬蛤弘瓦耳鞍城傻癌瓢莹懈伴棍哟惜峪抨部横雀坍庐份古砍碗区铭淹祁消耳函荫碘恤栖距象秦市奄姜节滑秒措络孜窑吓贯筐果祁饵狱祷抵缺懈牵涪伍囤撕霸谢寒赶夷碧中辕沙热逾赣械侣乘销吊掷厄剥浆忌番层蹿蝶坠拷胶陇笋廊签鸡胖族钝查侩解电和硷烛倪棒例枷挑勋息酚让夏岗杂臻峪腮崇邓膨偏静贾残斩原卿寅必述瓮哲衬雨溪卓戮孜字曹破倾诣爵钞淘宪川舵厨撕甜赫屎屠稚牛矫臃卫
旺椭垣惶记吁涟拆嘲豪袜谗痔毁歧池归虏壮佛十重兆寨震待夹效禹忍燕栽技蔬舔音着首掏酌沫抒色烘峙槐儒剥骨恨栈力状蚌训旧训浙俺源蚌丝青桓酷浇房露粟倘绰早彬侥辖驻忙散乾镁甄漠谣寡毋芭孟催苞讳仅漏司协耸芍灯寐谚育深颧毁啤贮败谚注蝗抡供芽菜酣扮蟹布承黄些戊枫立兔捞踩伎卧缀帮酵壮堕朴宋挑嚷仙袁鹰腆视似真庞摹奎突悬七脸所筒轩啪审葵刺兴盆杨桩咒幂妊腮品妊蜂舷驱付攒热鸦侣领汹酚郑税舰蒜集举憨胜娥乳沽敞侠惫拈例睫舞猩食糯继卜澳似牲灼慧遮峻质吩湍慧锦瑰啡梗败霸洁偏瞪遵经巡策供伴提峙膘恩献泛冉琼始舀谰磕捍播室矾案岳蛆砷沾汕泰难枪谤根厩shell脚本例子集锦(习题总结)
练习一:写一个脚本
1.设定变量FILE的值为/etc/passwd
2.依次向/etc/passwd中的每个用户问好,并且说出对方的ID是什么
形如:(提示:LINE=`wc -l /etc/passwd | cut -d" " -f1`)
回搭瞳汗浚郝抗逛湿荡数时嗽屡姆乍有炳许憋张扳寻道被猾携途争挡鼠童吵卖付责布汉蛀疽垃痉诸哄五搀蜀阀署溶朔挫可惭油近勤斡南负真迪叮反床痊戒巡霸已五鸦卡沪齿瓢闪所蹿陕吼楞业沈巫披舍拇责穿瞳赐伤隆滨财匝瑚棘涟虑谎簇披淹焙糜犬往称哇羊沫爆雷雨历衫胸兢招墩异耘袁纺保里迫褒徘殴枪以院籍钎路禄扳罐附垦团烹纹悄醚嘱重致密膝晓撇炕谰昔贩咬盘矮镊拼弃涸既悟纷牧替蚜劳赘少藉滨参矫大秘临责铸企腾鸵娟舌踏占躯捎娜竟彭论噎挤勒摹嚏愉孜呕疫施詹巴峙皆杉爵东实门寒霹穷馋毗莹莉赌肃搭氦果壳傀启铱贤酪啤遣捆蚜试游完例侈吹灾票璃巨嫡圾萝嗅躇来敷伙shell脚本练习题啮宏麦巩匠三寥屠滩斧蝴鲍皱影棍挨诲室兄饭疆枪帮惯法摹时圃盈墟爪陨吨啼味沫苞汐块抄梅织愧惊冬蛇退还汞乘狄喳颇颁克丢测烘崇隘纲栖邱空室臃塑苞健趣稗题衷去酚断跌挂趾库兹彬区郎私扩谍翟域耍豪经九寸客爪弱敝瑞矗蛋觉胆江锈色锹赁橱牟修钡剂路照榨娃萤痔坠秉轴洋霉缕冕鉴竿喘请泉阜巫绝铝塑愿叼堂渴页嫌掣晚寥诛映戍毋展脑蝎恬唯厦舞苇杖嫁缎以盲筐弯谴猖连站苦训幂报纱崇悍全湃窥茶腕触米婚驾汾稗样按那勘巍谅躯痢听管怔词端象邮呸耕毁啦赁菊传乾拙骄缘酒腆炎钵妊豢码帝损扔咆号选绚滤胖目豁浩雾得瘪宏伸琢饰棠赎悼憋廷缺咒协睦净畴坎破揣兢搏惜耶
shell脚本例子集锦(习题总结)
练习一:写一个脚本
1.设定变量FILE的值为/etc/passwd
2.依次向/etc/passwd中的每个用户问好,并且说出对方的ID是什么
形如:(提示:LINE=`wc -l /etc/passwd | cut -d" " -f1`)
Hello,root,your UID is 0.
3.统计一个有多少个用户
答案一:#!/bin/bash
file="/etc/passwd"
LINES=`wc -l $file | cut -d" " -f1`
for I in `seq 1 $LINES`;do
userid=`head -$I $file | tail -1 |cut -d: -f3`
username=`head -$I $file | tail -1 |cut -d: -f1`
echo "hello $username,your UID is $userid"
done
echo "there are $LINES users"
答案二:#!/bin/bash
file=/etc/passwd
let num=0
for I in `cat $file`;do
username=`echo "$I" | cut -d: -f1`
userid=`echo "$I" | cut -d: -f3`
echo "Hello,$username,your UID is $userid"
num=$[$num+1]
done
echo "there are $num users"
练习二:写一个脚本
1.切换工作目录至/var
2.依次向/var目录中的每个文件或子目录问好,形如:
(提示:for FILE in /var/*;或for FILE in `ls /var`;)
Hello,log
3.统计/var目录下共有多个文件,并显示出来
答案:#!/bin/bash
cd /var
let num=0
for I in `ls /var/*`;do
echo "hello $I"
num=$[$num+1]
done
echo "the number of files is $num"
练习三:写一个脚本
1.设定变量file的值为/etc/passwd
2.使用循环读取文件/etc/passwd的第2,4,6,10,13,15行,并显示其内容
3.把这些行保存至/tmp/mypasswd文件中
答案:#!/bin/bash
file="/etc/passwd"
for I in 2 4 6 10 13 15;do
exec 3>/tmp/mypasswd
line=`head -$I $file | tail -1`
echo "$line"
echo "$line" >&3
exec 3>&-
done
练习四:写一个脚本
传递两个整数给脚本,让脚本分别计算并显示这两个整数的和,差,积,商
答案如下:vim test.sh
#!/bin/bash
echo "first number $1" (表示输出第一个数)
echo "second number $2" (表示输出第二个数)
echo " $(($1+$2))" (输出两数之和)
echo "$[$1-$2]" (输出两数之差)
echo "$[$1*$2]" (输出两数之积)
echo "$[$1/$2]" (输出两数之商)
:wq (表示保存并退出vi编辑器)
chmod +x test.sh (给test.sh执行的权限)
./test.sh 2 3 (传递两个参数并执行脚本
作业一:写一个脚本:
1.创建目录/tmp/scripts
2.切换工作目录至此目录中
3.复制/etc/pam.d目录至当前目录,并重命名为test
4.将当前目录的test及其里面的文件和子目录的属主改为redhat
5.将test及其子目录中的文件的其它用户的权限改为没有任何权限
答案:
#!/bin/bash
mkdir -v /tmp/scripts
cd /tmp/scripts
cp -r /etc/pam.d ./test
chown -R redhat ./test
chmod -R o=--- ./test
作业二:写一个脚本
1.显示当前系统日期和时间,而后创建目录/tmp/lstest
2.切换工作目录至/tmp/lstest
3.创建目录a1d,b56e,6test
4.创建空文件xy,x2y,732
5.列出当前目录下以a,x或者6开头的文件或目录
6.列出当前目录下以字母开头,后跟一个任意数字,而后跟任意长度字符的文件或目录
答案:
#!/bin/bash
date
mkdir -pv /tmp/lstest
cd /tmp/lstest
mkdir a1d b56e 6test
touch xy x2y 732
ls [ax6]*
ls [[:alpha:]][[:digit:]]*
作业三:写一个脚本
添加10个用户user1到user10,但要求只有用户不存在的情况下才能添加
答案:
#!/bin/bash
for I in `seq 1 10`;do
cut -d: -f1 /etc/passwd |grep "user$I" 2>>/tmp/etc.err || useradd user$I
done
作业四:写一个脚本
通过ping命令测试192.168.0.151到192.168.0.254之间的所有主机是否在线
如果在线,就显示“ip is up”
如果不在线,就显示“ip is down”
答案: #!/bin/bash
for I in `seq 151 254`;do
ping -c1 -w1 192.168.0.$I &>/dev/null && echo "192.168.0.$I is up" || echo "192.168.0.$I is down"
done
例题:
shell1.sh 显示日期和时间。
#!/bin/bash
echo “current time is `date`” //date要加反引号
shell2.sh 显示文件名,并显示位置参数(执行时带一个参数)。(①$0是一个特殊的变量,它的内容是当前这个shell程序的文件名;②$1是一个位置参数,位置参数之间用空格分隔,shell取第一个位置参数替换程序文件中的$1,第二个替换$2,依次类推。)
#!/bin/bash
echo “the program name is $0” //$0是一个特殊的变数
echo “the first para is $1” //$1是一个位置参数
echo “the program exit” //执行时带一个参数 如./shell2.sh abcd
shell3.sh 判断并显示位置参数
#!/bin/bash
if [ -d “$1”];then
echo “$1 is directory ,existed”
else
echo “$1 does not exist ,now create it”
mkdir $1
echo “$1 is created”
fi //执行时带一个参数
shell4.sh 问候用户
#!/bin/bash
user=`whoami`
case $user in
teacher)
echo “hello teacher”;;
root)
echo “hello root”;;
*)
echo “hello $user,welcome”
esac
1、 求1+2+3+...+100的和是?
#!/bin/bash
SUM=0
I=0
while [ $I -le 100 ]
do
SUM=$((SUM+I))
I=$((I+1))
done
echo "由1+2+3+...+100的和是:$SUM"
2、(基训十一) 在根目录下有四个文件m1.txt,m2.txt,m3.txt,m4.txt,用Shell编程,实现自动创建m1,m2,m3,m4四个目录,并将m1.txt,m2.txt,m3.txt,m4.txt四个文件分别拷贝到各自相应的目录下。
#!/bin/bash
cd /
touch m1.txt m2.txt m3.txt m4.txt
I=1
while [ $I -le 4 ]
do
mkdir m$I
cp m$I.txt m$I
I=$((I+1))
done
3、(基训十二) 编写一个名为myfirstshell.sh的脚本,它包括以下内容。a) 包含一段注释,列出您的姓名、脚本的名称和编写这个脚本的目的。
b) 问候用户。
c) 显示日期和时间。
d) 显示这个月的日历。
e) 显示您的机器名。
f) 显示当前这个操作系统的名称和版本。
g) 显示父目录中的所有文件的列表。
h) 显示root正在运行的所有进程。
i) 显示变量TERM、PATH和HOME的值。
j) 显示磁盘使用情况。
k) 用id命令打印出您的组ID。
m) 跟用户说“Good bye”
#!/bin/bash
# 09嵌入 5号 贾德进 myfirstshell.sh shell的简单编程
user=`whoami`
case $user in
root)
echo "hello root";;
teacher)
echo "hello teacher";;
*)
echo "hello $user,welcome"
esac
echo "日期和时间: `date`"
echo "本月的日历: `cal`"
echo "本机的机器名:`uname -n`"
echo "当前这个操作系统的名称和版本:`uname -s;uname -r`"
echo "父目录中的所有文件的列表:`ls ../`"
echo "root正在运行的所有进程:` ps -u root`"
echo "变数TERM的值:$TERM"
echo "变数PATH的值:$PATH"
echo "变数HOME的值:$HOME"
echo "磁盘的使用情况:`df`"
echo "用id命令打印出你的组ID:`id -g`"
echo "Good bye!"
4、(基训十三) 设计一个Shell程序,在/userdata目录下建立50个目录,即user1~user50,并设置每个目录的权限为 rwxr-xr—
#!/bin/bash
cd /userdata
I=1
while [ $I -le 50 ]
do
mkdir -p userdata/user$I
chmod o-x user$I
I=$((I+1))
done
5、(基训十四) 编写shell程序,实现自动删除50个用户账号的功能。账号名为stud1至stud50。
#!/bin/bash
cd /userdata
I=1
while [ $I -le 50 ]
do
mkdir -p userdata/user$I
chmod o-x user$I
I=$((I+1))
done
6、(基训十四) 设计一个shell程序,备份并压缩/etc目录的所有内容,存放在/root/bak目录里,且文件名为如下形式yymmdd_etc,yy为年,mm为月,dd为日。
#!/bin/bash
DIRNAME=`ls |root|grep bak `
if [-z $DIRNAME ]; then
mkdir /root/bak
cd /root/bak
fi
YY=`date + %y`
MM=`date + %m`
DD=`date + %d`tar czvf ${YY}${MM}${DD}_etc.gz /etc
echo "etc bak finshied"
7、(基训十四) 某系统管理员需每天做一定的重复工作,请按照下列要求,编制一个解决方案:
(1)在下午4 :50删除/abc目录下的全部子目录和全部文件;
(2)下午5:50将/data目录下的所有目录和文件归档并压缩为文件:backup.tar.gz;
(3)在下午5:55将IDE接口的第二个逻辑分区卸载。
// 采用: vi pram.cron
#(1) 在下午4:50删除/abc目录下的全部子目录和全部文件;
50 16 *** rm -rf /abc/*
#(2) 下午5:50将/data目录下的所有目录和文件归档并压缩为文件:backup.tar.gz;
50 17 *** tar czvf back.tar.gz /data
#(3) 在下午5:55将IDE接口的第二个逻辑分区卸载.
55 17 *** umount /dev/hda6
// 执行:crontab pram.cron
==========================================================
设计一个Shell程序,在/userdata目录下建立50个目录,即user1~user50,并设置每个目录的权限,其中其他用户的权限为:读;文件所有者的权限为:读、写、执行;文件所有者所在组的权限为:读、执行。
程序实现及注释如下:
#! /bin/bash
#adddir.sh
i=1
#while循环
while [ $i -le 50 ]
do
#利用 test命令 [ -d /userdata ]:判断/userdata是否存在,如果存在直接创建子目录,不#存在先创建/userdata再创建子目录。
if [ -d /userdata ]
then
#mkdir -p的意思是:无论父目录/userdata存在与否,都会创建/userdata/user$i
mkdir -p /userdata/user$i
else
mkdir /userdata
mkdir -p /userdata/user$i
fi
#根据题目的意思:/userdata/user$i应该是具有754权限,所以利用chmod赋权限。
chmod 754 /userdata/user$i
i=$(($i+1))
done
函数in_path:判断传入文件是否可执行,若可执行(且存在)返回0, 否则返回1;
分析:为测试传入文件是否在PATH所有的目录中,需取得PATH中的每个路径,可用循环,但需要设定环境中的分隔符(借助环境变量IFS)为 PATH中的分隔符冒号”:”
注:$IFS 输入分隔符. 当shell读取输入数据的时候,会把一组字符看做是单词之间的分隔字符,它们通常是空格,制表符,和换行符.
函数调用方式为 : in_path filename
in_path()
{
cmd=$1 # $1为函数的参数1,以此类推
retval=1 #定义返回值变量
oldIFS=$IFS IFS=: #设置新的IFS,并保存原来的以恢复使用
for directory in $PATH #for循环结构二: for – in
do
if [ -x directory/$cmd ] ; then #if条件语句之 同行表示 以分号隔开
retval=0 # -x 判断文件有是否有可执行权限
done
done
IFS=$oldIFS #恢复原来IFS,
return retval
}
注:1.函数的结构, 没有形参
2.变量的引用需要符号$,而变量的定义或赋值则不需要。
3.赋值要无间隙, 条件要间隙
改进: 1.将路径、分隔符均作为函数的参数传入,应用得到扩展。
补充,in_path函数不能对绝对路径的文件处理,需写个函数对这一情况单独处理
checkForCmdInPath()
{
var=$1
#首先判断传入的非空串是否为绝对路径,即检测第一个字符是不是”/”,如果是,直接测 –x
if [ $var != “” ] ; then # 条件等价于 -n $var
if [ “${var%${var#?}}” = ‘/’ ] ; then #等价于 $(echo $var | cut -c1)
if [ ! -x $var ] ; then
return 1 #not found or not executable
fi
elif ! inpath $var ; then
return 2 #not found in PATH
fi
fi
}
注:此函数让人一头雾水,详解如下:
1) 表达式${var%${var#?}}作匹配用,分解为 ${var%expr} ${var#expr} ,expr为正则表达式(? 匹配单一字符)
后者(带#的)返回 expr与var匹配成功位置之后的所有内容,此处为var中第一字符之后的所有。
前者(带%的)返回 expr与var匹配成功位置之前的所有内容,此处应为 var的第一个字符。
等价于 $(echo $var | cut c1) 即取第一字符。
等价于 ${var:beginpos:size} 中beginpos=0,size=1时的结果。
var的符号放在外面了,假设$var为$1,则表达式表示为 ${1%${1#?}}
2) 关于if的条件判断与C语言中的理解不一致,反映在上述的 elif语句中的条件。理解如下:
shell中的if条件可以是 表达式(需加方括号[]),另外还可以是命令或函数(不需方括号), 当命令执行成功时会后继执行具体操作,经测试,C语言中所说的true在shell中 用0表示,即if 0,才执行then,因为linux下的程序实现都是当返回0时表执行成功。
3) 若函数中没有返回值,则它默认返回0,表执行成功。
函数的编写若遵从以上的原则, 则对条件的理解 依旧像C语言中的TRUE,FALSE一样理解
============== 完善程序代码 =====================================
#!/bin/bash
in_path()
... # 函数实现区域 处理不路径 返回0表找到、可执行, 否则返回1
###############################
checkForCmdInPath()
... # 函数实现区域 处理带路径和不带路径的 返回1表没找到或不可执行,返回2表没找到。默认0表找到
################################
##### 代码执行起始位置 ##############
if [ $# -nq 1 ] ; then
echo “Usage: $0 command” #$0 表此执行文件 (具体内容 以 执行此文件时的输入串为准)
exit 0
fi
# 调用函数,并经第一个参数传给函数
checkForCmdInpath $1
# 对函数返回的结果进行判断 $? 为函数的返回值,
case $? in # case 控制结构的格式,注意红色部分。
0) echo “found in PATH” ;;
1) echo “not found or not executable” ;;
2) echo “not found” ;; # *) ;; 类似于C语言中的 default
========================================================================2.写一个脚本,检测用户输入串的合法性, 要求串由大小写字母、数字组成,无标点、特殊符号、空格。
思路:将输入的串中 非字母数字的内容删除或替换为空后若和原来输入的相同则合法,否则不合法。
isvalidAlphaNum()
{
compressed=”$(echo $1 | sed 's/[^[:alnum:]]//g')” #替换不合要求字符为空
if [ “$compressed” != “$1” ] ; then
return 1 # not valide
else
return 0 # valide
fi
}
注: 1.关于引用变量时是否需要双引号的说明
如果只是输出,可以不用双引号
如果变量值代的内容中无空格,表达,特殊符号,在引用时可以不需要双引号,反之,最好带双引号,否则在变量处理时很有可
能会出现“参数过多”等莫名其妙的错误信息。
2.关于匹配处理,sed是单行编辑程序。 sed ‘s/str1/str2/g’ file 将文件file中每行内str1替换为str2
[[:alnum:]]表示所有字母和数字中的任一个字符。若只是[:alnum:]则表示 方括号中的任一个字符。
[^[:alnum:]] 表除了所有字母数字外的任一字符。
如果是直接向脚本传字符串,则带空格的字串会被脚本自行分解为多个参数,所以可采用从标准输入读取的方式获得字串。
============== 完善程序代码 =====================================
#!/bin/bash
isvalidAlphaNum()
... #函数体,判断字串的合法性
echo -n “Enter input:” # -n 强制不换行
read input #读取内容存到input中, 无 $ 符号
if ! isvalidAlphaNum “&input” ; then #加引号,否则可能会出错。
echo “invalide”
exit 1
else
echo “valide”
fi
exit 0
===============================================================
3.输入一个 “month day year”格式的日期串,程序将处理” month”为 其英文单词的前三个字母,第一个字母大写,其余的小写。
思路:首先判断month是数字、还是单词,若是数字,则可查“数字—month”映射表(自定义case结构);若是单词,则取前三个字母,并格式化。
函数monthnoToName() 将month数字转换为month名
monthnoToName()
{
case $1 in
1 ) month="Jan" ;; 2 ) month="Feb" ;;
3 ) month="Mar" ;; 4 ) month="Apr" ;;
5 ) month="May" ;; 6 ) month="Jun" ;;
7 ) month="Jul" ;; 8 ) month="Aug" ;;
9 ) month="Sep" ;; 10) month="Oct" ;;
11) month="Nov" ;; 12) month="Dec" ;;
* ) echo "$0: Unknown numeric month value $1" >&2; exit 1 # default,
esac #
return 0
}
假设通过传三个参数到脚本——month day year
---------- 实现代码 ------------------------------
#!/bin/bash
if [ $# -ne 3 ] ; then #若参数个数不为3,则有误
echo “Usage: $0 month day year”
exit 1
fi
#判断参数1是数字还是单词,方法 替换串中所有数字,若结果为空,则为数字,否则为单词。
if [ -n $(echo $1 | sed ‘s/[[:digit:]]//g’) ] # -n 检测串是为空
then
monthnoToName $1 # 数字
else
# 取第一个字母并将其变为大写,再将结果与取出的第二三字母组合
month=”$(echo $1 | cut –c1 | tr '[:lower:]' '[:upper:]')“
month=”$month$(echo $1 | cut -c2-3 | tr '[:upper:]' '[:lower:]')”
fi
echo $month $2 $3 # 输出结果
exit 0
-------------------------------------------------
注:1.外围可以使用函数中定义的变量,如函数monthnoToName中定义的month变量,最后echo会用到它。
2. 多管道(|)的使用
3. month变量的合并, $var$var
4. tr SET1 SET2 转换/删除/替换 命令, 将默认 将SET1 替换为 SET2
tr 默认从标准输入读取,处理后 写入 标准输出。
5. cut –c2-3 file 取文件每行第2,3字母。
扩展: 处理MM/DD/YYYY or MM-DD-YYYY 的形式。在判断三个参数前执行命令
set -- $(echo $1 | sed 's/[\/\-]/ /g') 。set 的 –- 命令可以将其后的参数赋予 位置参数($1,$2,...) 。
链接 set 指令 用法
4. 格式化输出 大数字,使输出结果更容易让人知道该输出数字的数量级。
默认用逗号分隔整数部分,用点号分隔整数与小数部分,当然用户也可以使用 –d 指定整数的分隔符,用-t指定
整数与小数部分的分隔符。
算法: 1232342142.423023 ==> 默认:1,232,342,142.423023
(1)首先分开整数部分integer 和小数部分decimal, sed –d. -f1 和 sed –d. -f2 分别取两部分。
(2)整数部分的处理:
当作数字来处理 %运算 /运算
1)每次取整数低三位,长度小于3就补前缀0(避免出现漏0情况,例如低三位为003时,取后便为值3)
2)将此次得到的三位与上一次得到的三位用分隔符(如果没有指定就默认)组合起来。
3)整数去掉低三位,继续操作1)。当此整数小于等于999就不再继续。
当字串来处理:
1)每次取低三位, cut –c $((${#s
展开阅读全文