免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: 網中人
打印 上一主题 下一主题

[学习共享] shell 十三問? [复制链接]

论坛徽章:
0
711 [报告]
发表于 2013-05-19 23:48 |只看该作者
1.深刻理解子进程与父进程的环境变量的关系,可以了解fork的效用,当运行子进程之后,会退至父进程中,并且环境变量不被影响。
2.了解脚本的实质。可以弄清souce的效用,顺序执行以后在当前进程继续执行子进程,也就是说并未产生子进程,而是继续执行的。
3.理解以上两条后,不难理解exec。exec虽然也在同一进程中执行,但是它的最大区别就是执行以后会立即结束当前的脚本,而不会继续执行父进程中的脚本中的命令。

论坛徽章:
0
712 [报告]
发表于 2013-05-19 23:58 |只看该作者
回复 59# 網中人


    确实搞懂fork与source,就不难搞懂()和{}!

论坛徽章:
0
713 [报告]
发表于 2013-05-20 16:16 |只看该作者
回复 61# 網中人


    纯属记录学习感悟,可以忽视我的存在。
    今天学习内容是:$()与${}之区别,其实功能上相差较大,只是形象上不太能一下就懂。$()主要用于嵌套shell命令,将后面的命令执行后传递给前面的命令,也就是重新组合。${}主要用于变量更精准的定位,以及变量可以衍生更多的功能,比如输出截取其中一段,更广泛地说就是可以重新编辑这个变量。$(())则是整数运算。

论坛徽章:
0
714 [报告]
发表于 2013-05-20 16:17 |只看该作者
咦?为什么没给我加积分呢?初来咋到还没搞懂论坛的规则。

论坛徽章:
0
715 [报告]
发表于 2013-05-20 16:45 |只看该作者
第9问学习记录:
要弄清$@和$*就需要弄清楚位置变量$1 $2这些,位置变量中需要注意${10}需要加入{}这个精准定位符号,我自己给他起的名字。或者加入shfit这个命令,让起忽视之前几个参数,但是个人觉得虽然这是楼主非常熟悉shell情况下想出来的方法,但是个人认为还是直接使用{}这个吧,免得像我们这种脑筋不太够用的人还得扳着手指头数半天。
弄清了位置变量可以认识$#这个东东。说到这里真心赞一句楼主的讲课功力,每一步介绍出来的东西都是一步一步引入,使得我们这种初学者学习起来毫不费力!比如(){}和exec source这两节。呵呵!
$@和$*还用说吗?记住就行了,非常好的初学帖子!非不怪走到那里都在推崇这个帖子。

论坛徽章:
0
716 [报告]
发表于 2013-05-21 11:45 |只看该作者
${file-my.file.txt} :假如 $file 沒有設定,則使用 my.file.txt 作傳回值。(空值及非空值時不作處理)
${file:-my.file.txt} :假如 $file 沒有設定或為空值,則使用 my.file.txt 作傳回值。 (非空值時不作處理)
${file+my.file.txt} :假如 $file 設為空值或非空值,均使用 my.file.txt 作傳回值。(沒設定時不作處理)
${file:+my.file.txt} :若 $file 為非空值,則使用 my.file.txt 作傳回值。 (沒設定及空值時不作處理)
${file=my.file.txt} :若 $file 沒設定,則使用 my.file.txt 作傳回值,同時將 $file 賦值為 my.file.txt 。 (空值及非空值時不作處理)
${file:=my.file.txt} :若 $file 沒設定或為空值,則使用 my.file.txt 作傳回值,同時將 $file 賦值為 my.file.txt 。 (非空值時不作處理)
${file?my.file.txt} :若 $file 沒設定,則將 my.file.txt 輸出至 STDERR。 (空值及非空值時不作處理)
${filemy.file.txt} :若 $file 沒設定或為空值,則將 my.file.txt 輸出至 STDERR。 (非空值時不作處理)

这一系列太难记了,网中人大侠也只说了有:和没有:基本可以判断是否影响空值。有没有大侠指导一下记忆方法。

论坛徽章:
0
717 [报告]
发表于 2013-05-21 13:10 |只看该作者
关于10问中的习题答案:
$ A=123
$ [ -n "$A" ] && [ "$A" -lt 100 ] || echo 'too big!'
too big!

$ unset A
$ [ -n "$A" ] && [ "$A" -lt 100 ] || echo 'too big!'
too big!

首先:方法1顺序执行下来是没有问题的,首先判断A的长度是非0的得到的VR是0,再执行123小于100的判断,得到VR为1,那么则执行too big的返回。
方法2则是判断了A的长度非0,得到VR为1,则不执行[ "$A" -lt 100 ],但是会执行echo,所以还是给出too big的结论。
按照大神给的提示,找到解决方案是[ -n "$A" ] && ([ "$A" -lt 100 ] || echo 'too big!')先判断是否大于100.
这个实验已经成功完成,但是遗留问题是如果换成[ "$A" -lt 100 ] && [ -n "$A" ] || echo 'too big!'顺序换过来,它会报错,不知道为什么?下午没时间了,晚上继续找答案!

论坛徽章:
0
718 [报告]
发表于 2013-05-22 21:03 |只看该作者
UGO911 发表于 2013-05-21 13:10
关于10问中的习题答案:
$ A=123
$ [ -n "$A" ] && [ "$A" -lt 100 ] || echo 'too big!'


报错原因是[ "$A" -lt 100 ]中需要整数表达,那也可以理解,但是为什么把它放在中间,并且先行执行就没有报错了呢?

论坛徽章:
0
719 [报告]
发表于 2013-05-24 09:55 |只看该作者
好久没有来了,第一次来chinaunix是进的shell 十三问,现在看了一下已经物是人非。chinaunix早就不是当初的那个了 。

论坛徽章:
0
720 [报告]
发表于 2013-05-25 21:23 |只看该作者
前两天工作中遇见complex case,好几天没看了,今天看到第11章,原来总觉得重定向与管道很简单,但是今天一看,还真是有很多可以利用得更好的地方。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP