免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 227440 | 回复: 10

[其他] SHELL版新手导航 [复制链接]

论坛徽章:
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
发表于 2005-12-23 11:18 |显示全部楼层
本帖最后由 waker 于 2011-10-22 08:51 编辑

当我们使用一个新的工具的时候,可能会碰到很多问题
一些问题是大家都碰到过的, 这里列出可以解决这些问题的文章
希望这支帖子对你有所帮助,希望大家有时间和兴趣读这些文章

在碰到问题的时候,这个老掉牙的方法对新手总是有效的
RTFM & STFW
RTFM: Read The Fucking Manul 阅读手册
STFW: Search The Fucking Web 搜索网络
这是一个良好的习惯
请读
http://bbs.chinaunix.net/thread-113564-1-1.html

Q0:我很急,高手帮帮我,有人知道怎么解决么?
A:请亲自到厕所解决,如果解决周期较长,建议打印一纸 http://bbs.chinaunix.net/thread-113564-1-1.html 带上阅读

Q1:不行啊
A:有两种解决方法:
1.去电线杆上找个老军医的手机,他是专治+包治这个的
2.仔细比对回复的内容和你操作的差别,比对回复者的测试环境与你的差别,如果还有问题,列出你的出错信息和现象,供大家帮助你解决问题


[ 本帖最后由 mocou 于 2005-12-23 11:31 编辑 ]

论坛徽章:
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
发表于 2005-12-23 11:19 |显示全部楼层
=================================================
如何开始
(文中的例子是在bash与pdksh中测试的)

  1. cat >hello.sh <<\EOF
  2. #!/bin/sh
  3. echo "Hello World!"
  4. EOF
  5. chmod +x hello.sh
  6. ./hello.sh
复制代码

把上面的代码贴到提示符下,不出意外的话,你已经完成了第一次shell编程

这里推荐的文章是
About Shell

看完后有兴趣可读
Unix系列shell程序编写(转)



=================================================

[ 本帖最后由 mocou 于 2005-12-23 11:38 编辑 ]

论坛徽章:
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
发表于 2005-12-23 11:19 |显示全部楼层
本帖最后由 waker 于 2011-10-22 08:53 编辑

=================================================
关于变量操作
Q1:不能进行变量赋值,不能得到自己想要的赋值结果,怎样把命令的结果赋给一个变量?
A: 可能你写错了shell语句,用了不适当的引号,请参考13问中引号与 $()的讨论
http://bbs.chinaunix.net/thread-503842-1-1.html


这里要重点提醒大家区分三个字符 ` ' "
如果大家的回帖中的结果和你的不一致,请仔细检查你输入这三个字符是不是和回帖一致

=================================================

论坛徽章:
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
发表于 2005-12-23 11:20 |显示全部楼层
本帖最后由 waker 于 2011-10-21 08:22 编辑

=================================================
关于文本处理
ed vi sed awk都是常用的文本处理工具,如果你还不了解它们是什么,最好读一下下面两篇关于sed与awk的教程,这两篇是最基础的,但非常经典(请使用big5编码阅读,关于乱码的问题已经超出了讨论时限,那应该是十年前讨论的问题)
http://phi.sinica.edu.tw/tyuan/o ... c/reports/96/96005/ BIG5编码
http://phi.sinica.edu.tw/tyuan/o ... c/reports/94/94011/ BIG5编码

grep也是常用的文本处理工具,它用来查找文本中你想要或不想要的东西,它的基本用法在

http://bbs.chinaunix.net/viewthread.php?tid=446683

文本处理中还有一门基本功是正则表达式,基础教程是
http://phi.sinica.edu.tw/aspac/reports/94/94019/
这篇教程请用big5码浏览
论坛中还有不错的讨论
http://bbs.chinaunix.net/forum/v ... hlight=%D5%FD%D4%F2

Q1:我使用了sed/awk,但文件没有改变
A:是的,这是正常的,sed/awk的结果缺省情况下是送到标准输出的,而不是改变原文件,你可以将结果重定向到一个临时文件,然后用mv覆盖原文件,关于重定向请参考
http://bbs.chinaunix.net/viewthr ... p;page=7#pid1636825
http://bbs.chinaunix.net/viewthr ... 5%26filter%3Ddigest
对于GNU sed 3以上版本的用户,可以用-i参数直接修改原文件

Q2:如何合并/对比两个文件,如何根据file1中的条件处理其它文件?
A:paste/comm/diff是解决这种问题的好工具
http://bbs.chinaunix.net/viewthr ... 1%26filter%3Ddigest
http://bbs.chinaunix.net/viewthr ... 1%26filter%3Ddigest
这里还有一个处理这种问题强大工具:awk,可以用一句话形容:只有想不到的,没有办不到的
http://bbs.chinaunix.net/viewthr ... 1%26filter%3Ddigest

Q3:为什么我使用回帖中的awk命令报错?
A:有两个可能最大:1.不够细心,仔细再对比一下与回帖有没有出入
2.因为你没使用Great GNU awk,如果没有gawk可用,可以尝试一下有没有nawk

Q4:如何在sed/awk中使用shell中的变量?反之呢?
A:1.关于awk使用shell变量的总结http://bbs.chinaunix.net/viewthr ... &extra=page%3D1
2.利用shell作变量替换(具体原理看13问之qouting)

  1. var=abcd
  2. sed:sed -n "/$var/p"   // awk: awk '/'"$var"'/'
  3. num=2
  4. sed: sed -n "${n}p"   //awk: awk 'NR=='"$var"''
  5. #sed要用双引号,awk变量顺序单双$var双单
复制代码
反之:sed/awk将变量传给shell可以用eval, 如
  1. eval $(awk 'BEGIN{print "a=ggg b=3"}')
  2. 然后
  3. echo $a;echo $b
  4. 测试一下
复制代码
================================================

[ 本帖最后由 waker 于 2005-12-23 12:05 编辑 ]

论坛徽章:
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
发表于 2005-12-23 11:20 |显示全部楼层
================================================
关于自动执行交互任务
Q1:如果实现ftp,telnet?
A: 用管道或here文档可以解决
http://bbs.chinaunix.net/viewthread.php?tid=158808
http://bbs.chinaunix.net/viewthread.php?tid=3139

Q2:为什么用管道或here文档的方法不能实现自动ssh,su与更改密码?
A:这些程序需要从tty获得输入而不是标准输入,通用的解决办法是expect,下面是这个工具的教程
http://bbs.chinaunix.net/forum/v ... mp;highlight=expect
http://bbs.chinaunix.net/forum/v ... mp;highlight=expect
对于ssh,有另一种用用密钥对验证的方法
http://bbs.chinaunix.net/viewthr ... 1%26filter%3Ddigest
对于GNU/linux用户,passwd使用--stdin选项可以接受标准输入,具体请man passwd

================================================

论坛徽章:
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
发表于 2005-12-23 11:20 |显示全部楼层
本帖最后由 expert1 于 2010-12-08 12:42 编辑


另外几个计算日期的函数,非GNU Shell可以看下(感谢Shell_HAT 提供)
http://bbs.chinaunix.net/thread-1772999-1-1.html

论坛徽章:
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
发表于 2005-12-23 11:21 |显示全部楼层
================================================
关于条件判断
Q1:为什么我的条件判断会出错?
A:是因为没遵循shell的语法
http://bbs.chinaunix.net/viewthr ... 6%26filter%3Ddigest
http://bbs.chinaunix.net/viewthread.php?tid=503842
================================================

论坛徽章:
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
发表于 2005-12-23 12:12 |显示全部楼层
=========================================
关于crontab
Q1:为何可以手工执行,加入crontab后却不能正确执行
A:1.如果crontab执行失败,会发送email给你,请在mail中查找出错原因
2.crontab中的PATH变量设置与交互式shell环境中不同,要执行的命令必须有正确路径
3.在crontab中%字符被认为是换行,所以你的命令中有%时,在crontab中要加\转义
比如

  1. 30 * * * * date '+%D' >datefile  
  2. 是错误的
  3. 正确的应该是
  4. 30 * * * * date '+\%D' >datefile
复制代码

==========================================

评分

参与人数 1信誉积分 +5 收起 理由
少林功夫好 + 5 解决了我的crontab中date不执行的问题。非常.

查看全部评分

论坛徽章:
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
发表于 2006-08-06 18:42 |显示全部楼层
关于while read只执行一次的问题
Q:下面的代码为何只执行了一次就退出了?
  1. seq 10 >file
  2. while read a
  3. do
  4. echo $a
  5. dd &>/dev/null
  6. done <file
复制代码


A:因为重定向是针对整个while循环块的,而不只是read命令
请参看下面的链接
http://bbs.chinaunix.net/viewthread.php?tid=769040

论坛徽章:
16
IT运维版块每日发帖之星
日期:2015-08-24 06:20:00综合交流区版块每日发帖之星
日期:2015-10-14 06:20:00IT运维版块每日发帖之星
日期:2015-10-25 06:20:00IT运维版块每日发帖之星
日期:2015-11-06 06:20:00IT运维版块每日发帖之星
日期:2015-12-10 06:20:00平安夜徽章
日期:2015-12-26 00:06:302016猴年福章徽章
日期:2016-02-18 15:30:34IT运维版块每日发帖之星
日期:2016-04-15 06:20:00IT运维版块每日发帖之星
日期:2016-05-21 06:20:00综合交流区版块每日发帖之星
日期:2016-08-16 06:20:002015七夕节徽章
日期:2015-08-21 11:06:17IT运维版块每日发帖之星
日期:2015-08-14 06:20:00
发表于 2011-08-18 20:56 |显示全部楼层
本帖最后由 expert1 于 2011-08-23 17:35 编辑

当你的文件操作,比如
awk '{print $1}' file得到逻辑上的第一个字段,print $2得到了第二个字段
而awk '{print $1,$2}' 却得不到逻辑上的前2个字段,那么此时要注意你的文件类型了,很可能是非Linux下文件,cat -A 看下是否正常。
一个常见的异常内容如下

20:50:07 up 55 days, 12:56,  3 users,  load average: 0.03, 0.08, 0.14^M$ (Linux正常的内容是$结尾的)

用dos2unix来转一下,这种问题很诡异而且隐蔽,遇到此类问题,不妨关注一下。

ps :假如没dos2unix,可以sed,vim替换,这个^M如何打出来?在终端上按住ctrl,同时再presss v 和m2个键,就可以了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP