免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2378 | 回复: 6
打印 上一主题 下一主题

[文本处理] 关于shell脚本的缩进格式 [复制链接]

论坛徽章:
18
辰龙
日期:2014-05-21 21:01:4115-16赛季CBA联赛之深圳
日期:2016-12-23 13:51:3815-16赛季CBA联赛之北控
日期:2016-11-28 18:26:3815-16赛季CBA联赛之佛山
日期:2016-11-03 11:18:5815-16赛季CBA联赛之辽宁
日期:2016-07-10 16:09:4115-16赛季CBA联赛之江苏
日期:2016-02-20 23:09:202015亚冠之塔什干棉农
日期:2015-08-17 19:49:492015年亚洲杯之日本
日期:2015-04-30 01:24:342015年亚洲杯之约旦
日期:2015-04-01 00:37:182015年亚洲杯之沙特阿拉伯
日期:2015-03-02 15:55:40处女座
日期:2014-05-25 10:34:0020周年集字徽章-年
日期:2023-04-23 11:17:52
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2015-05-28 02:42 |只看该作者 |倒序浏览
本帖最后由 bikkuri 于 2015-05-28 02:48 编辑

关于shell脚本的缩进格式

大家好!
我有一个问题向大家请教。
假如有以下一个子程序,程序本身不是重点,重点是程序的格式。
  1. compare(){
  2. i=$1;j=$2
  3. imin=$(echo ${i#*.}|awk '{print length($0)}');jmin=$(echo ${j#*.}|awk '{print length($0)}')
  4. if [ $imin -gt $jmin ]; then m=$imin; else m=$jmin; fi
  5. im=$(echo $i|awk -vn=$m '{y=$0;for(x=n;x>0;x--)y*=10}END{print y}')
  6. jm=$(echo $j|awk -vn=$m '{y=$0;for(x=n;x>0;x--)y*=10}END{print y}')
  7. if [ $im -gt $jm ];then echo "$i"; else echo "$j";fi
  8. return
  9. }
复制代码
大家可以看到,这段程序没有采用缩进格式,而且有时候几行命令合并写在一行里,可读性比较差。
将这段程序输入到命令行执行:
  1. [enb@hp8:~]$ compare(){
  2. > i=$1;j=$2
  3. > imin=$(echo ${i#*.}|awk '{print length($0)}');jmin=$(echo ${j#*.}|awk '{print length($0)}')
  4. > if [ $imin -gt $jmin ]; then m=$imin; else m=$jmin; fi
  5. > im=$(echo $i|awk -vn=$m '{y=$0;for(x=n;x>0;x--)y*=10}END{print y}')
  6. > jm=$(echo $j|awk -vn=$m '{y=$0;for(x=n;x>0;x--)y*=10}END{print y}')
  7. > if [ $im -gt $jm ];then echo "$i"; else echo "$j";fi
  8. > return
  9. > }
  10. [enb@hp8:~]$
复制代码
这个时候如果用type命令查看这个函数compare,可以看到显示出来的程序被系统进行了格式化处理!
整个程序按照缩进式格式重新排列,可读性好多了!
  1. [enb@hp8:~]$ type compare
  2. compare is a function
  3. compare ()
  4. {
  5.     i=$1;
  6.     j=$2;
  7.     imin=$(echo ${i#*.}|awk '{print length($0)}');
  8.     jmin=$(echo ${j#*.}|awk '{print length($0)}');
  9.     if [ $imin -gt $jmin ]; then
  10.         m=$imin;
  11.     else
  12.         m=$jmin;
  13.     fi;
  14.     im=$(echo $i|awk -vn=$m '{y=$0;for(x=n;x>0;x--)y*=10}END{print y}');
  15.     jm=$(echo $j|awk -vn=$m '{y=$0;for(x=n;x>0;x--)y*=10}END{print y}');
  16.     if [ $im -gt $jm ]; then
  17.         echo "$i";
  18.     else
  19.         echo "$j";
  20.     fi;
  21.     return
  22. }
  23. [enb@hp8:~]$
复制代码
我想请问一下,为什么输入的子程序会被格式化处理?
如果不是一个子程序,而是一个完整的shell脚本程序,有什么命令或者方法可以自动做这样的缩进式格式化处理吗?
比如我希望对/home/enb/scripts/目录下的所有*.sh文件做这样的缩进式格式化处理,应该怎么办呢?
谢谢大家!

论坛徽章:
8
摩羯座
日期:2014-11-26 18:59:452015亚冠之浦和红钻
日期:2015-06-23 19:10:532015亚冠之西悉尼流浪者
日期:2015-08-21 08:40:5815-16赛季CBA联赛之山东
日期:2016-01-31 18:25:0515-16赛季CBA联赛之四川
日期:2016-02-16 16:08:30程序设计版块每日发帖之星
日期:2016-06-29 06:20:002017金鸡报晓
日期:2017-01-10 15:19:5615-16赛季CBA联赛之佛山
日期:2017-02-27 20:41:19
2 [报告]
发表于 2015-05-28 09:28 |只看该作者
搜下 shell script indent

论坛徽章:
18
辰龙
日期:2014-05-21 21:01:4115-16赛季CBA联赛之深圳
日期:2016-12-23 13:51:3815-16赛季CBA联赛之北控
日期:2016-11-28 18:26:3815-16赛季CBA联赛之佛山
日期:2016-11-03 11:18:5815-16赛季CBA联赛之辽宁
日期:2016-07-10 16:09:4115-16赛季CBA联赛之江苏
日期:2016-02-20 23:09:202015亚冠之塔什干棉农
日期:2015-08-17 19:49:492015年亚洲杯之日本
日期:2015-04-30 01:24:342015年亚洲杯之约旦
日期:2015-04-01 00:37:182015年亚洲杯之沙特阿拉伯
日期:2015-03-02 15:55:40处女座
日期:2014-05-25 10:34:0020周年集字徽章-年
日期:2023-04-23 11:17:52
3 [报告]
发表于 2015-05-28 13:25 |只看该作者
结果: 找到 “shell script indent” 相关内容 0 个
对不起,没有找到匹配结果。

回复 2# waker


   

论坛徽章:
18
辰龙
日期:2014-05-21 21:01:4115-16赛季CBA联赛之深圳
日期:2016-12-23 13:51:3815-16赛季CBA联赛之北控
日期:2016-11-28 18:26:3815-16赛季CBA联赛之佛山
日期:2016-11-03 11:18:5815-16赛季CBA联赛之辽宁
日期:2016-07-10 16:09:4115-16赛季CBA联赛之江苏
日期:2016-02-20 23:09:202015亚冠之塔什干棉农
日期:2015-08-17 19:49:492015年亚洲杯之日本
日期:2015-04-30 01:24:342015年亚洲杯之约旦
日期:2015-04-01 00:37:182015年亚洲杯之沙特阿拉伯
日期:2015-03-02 15:55:40处女座
日期:2014-05-25 10:34:0020周年集字徽章-年
日期:2023-04-23 11:17:52
4 [报告]
发表于 2015-05-29 18:24 |只看该作者
有人帮忙回答一下吗?

论坛徽章:
18
辰龙
日期:2014-05-21 21:01:4115-16赛季CBA联赛之深圳
日期:2016-12-23 13:51:3815-16赛季CBA联赛之北控
日期:2016-11-28 18:26:3815-16赛季CBA联赛之佛山
日期:2016-11-03 11:18:5815-16赛季CBA联赛之辽宁
日期:2016-07-10 16:09:4115-16赛季CBA联赛之江苏
日期:2016-02-20 23:09:202015亚冠之塔什干棉农
日期:2015-08-17 19:49:492015年亚洲杯之日本
日期:2015-04-30 01:24:342015年亚洲杯之约旦
日期:2015-04-01 00:37:182015年亚洲杯之沙特阿拉伯
日期:2015-03-02 15:55:40处女座
日期:2014-05-25 10:34:0020周年集字徽章-年
日期:2023-04-23 11:17:52
5 [报告]
发表于 2015-06-01 10:48 |只看该作者
沉的好快啊。。。
继续求助。。。

论坛徽章:
23
15-16赛季CBA联赛之吉林
日期:2017-12-21 16:39:27白羊座
日期:2014-10-27 11:14:37申猴
日期:2014-10-23 08:36:23金牛座
日期:2014-09-30 08:26:49午马
日期:2014-09-29 09:40:16射手座
日期:2014-11-25 08:56:112015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:0315-16赛季CBA联赛之山东
日期:2017-12-21 16:39:1915-16赛季CBA联赛之广东
日期:2016-01-19 13:33:372015亚冠之山东鲁能
日期:2015-10-13 09:39:062015亚冠之西悉尼流浪者
日期:2015-09-21 08:27:57
6 [报告]
发表于 2015-06-01 10:58 |只看该作者

论坛徽章:
18
辰龙
日期:2014-05-21 21:01:4115-16赛季CBA联赛之深圳
日期:2016-12-23 13:51:3815-16赛季CBA联赛之北控
日期:2016-11-28 18:26:3815-16赛季CBA联赛之佛山
日期:2016-11-03 11:18:5815-16赛季CBA联赛之辽宁
日期:2016-07-10 16:09:4115-16赛季CBA联赛之江苏
日期:2016-02-20 23:09:202015亚冠之塔什干棉农
日期:2015-08-17 19:49:492015年亚洲杯之日本
日期:2015-04-30 01:24:342015年亚洲杯之约旦
日期:2015-04-01 00:37:182015年亚洲杯之沙特阿拉伯
日期:2015-03-02 15:55:40处女座
日期:2014-05-25 10:34:0020周年集字徽章-年
日期:2023-04-23 11:17:52
7 [报告]
发表于 2015-06-02 00:23 |只看该作者
本帖最后由 bikkuri 于 2015-06-02 00:30 编辑

您的意思是说用这个indent来处理脚本的缩进吗?
  1. compare(){
  2. i=$1;j=$2
  3. imin=$(echo ${i#*.}|awk '{print length($0)}');jmin=$(echo ${j#*.}|awk '{print length($0)}')
  4. if [ $imin -gt $jmin ]; then m=$imin; else m=$jmin; fi
  5. im=$(echo $i|awk -vn=$m '{y=$0;for(x=n;x>0;x--)y*=10}END{print y}')
  6. jm=$(echo $j|awk -vn=$m '{y=$0;for(x=n;x>0;x--)y*=10}END{print y}')
  7. if [ $im -gt $jm ];then echo "$i"; else echo "$j";fi
  8. return
  9. }
复制代码
还是以以上这个脚本为例:
  1. [enb@hp8:~/test]$ indent a.sh -o a.sh.new
  2. indent: a.sh:4: Error:Unmatched 'else'
  3. indent: a.sh:7: Error:Unmatched 'else'
  4. indent: a.sh:10: Error:Unexpected end of file
  5. [enb@hp8:~/test]$ cat a.sh.new
  6. compare ()
  7. {
  8.   i = $1;
  9.   j = $2 imin = $ (echo $
  10.                    {
  11.                    i
  12. #*.}|awk '{print length($0)}');jmin=$(echo ${j#*.}|awk '{print length($0)}')
  13.                    if[$imin - gt $jmin]; then m = $imin;
  14.                    else
  15.                    m = $jmin; fi
  16.                    im = $ (echo $i | awk - vn =
  17.                            $m '{y=$0;for(x=n;x>0;x--)y*=10}END{print y}') jm =
  18.                    $ (echo $j | awk - vn =
  19.                       $m '{y=$0;for(x=n;x>0;x--)y*=10}END{print y}') if[$im -
  20.                                                                         gt
  21.                                                                         $jm];
  22.                    then echo "$i";
  23.                    else
  24.                    echo "$j"; fi return}
  25. [enb@hp8:~/test]$
复制代码
看起来很不靠谱啊?
是要用什么参数吗?
  1. [enb@hp8:~/test]$ indent -bad -bap -bbb -bbo -nbc -bl -bli0 -bls -c33 -cd33 -ncdb -ncdw -nce -cli0 -cp33 -cs -d0 -nbfda -di2 -nfc1 -nfca -hnl -ip5 -l75 -lp -pcs -nprs -psl -saf -sai -saw -nsc -nsob -nss -i4 -ts4 -ut a.sh -o a.sh.new
  2. indent: a.sh:4: Error:Unmatched 'else'
  3. indent: a.sh:7: Error:Unmatched 'else'
  4. indent: a.sh:10: Error:Unexpected end of file
  5. [enb@hp8:~/test]$ cat a.sh.new
  6. compare ()
  7. {
  8.         i = $1;
  9.         j = $2 imin = $ (echo $
  10.                                          {
  11.                                          i
  12. #*.}|awk '{print length($0)}');jmin=$(echo ${j#*.}|awk '{print length($0)}')
  13.                                          if[$imin - gt $jmin]; then m = $imin;
  14.                                          else
  15.                                          m = $jmin; fi
  16.                                          im = $ (echo $i | awk - vn =
  17.                                                          $m '{y=$0;for(x=n;x>0;x--)y*=10}END{print y}')
  18.                                          jm = $ (echo $j | awk - vn =
  19.                                                          $m '{y=$0;for(x=n;x>0;x--)y*=10}END{print y}')
  20.                                          if[$im - gt $jm]; then echo "$i";
  21.                                          else
  22.                                          echo "$j"; fi return}
  23. [enb@hp8:~/test]$
复制代码
显然和顶楼的效果差得太远啦。。。


回复 6# ly5066113


   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP