你很可能正在使用bash,也可能是csh。你可能听说过sh、tcsh。如果你安装过EDA,就知道某EDA要正常工作必须要装ksh。另外你可能还听某大神安利过zsh……
一图看懂各种shell的联系与区别
那这么多shell有什么联系和区别,我们先来看看它们的历史和关系。下图基于维基百科资料整理:
ICer该如何选择shell
那么这么多shell,我们ICer该如何选择呢?看以下几条信息:
在现代化的操作系统中,比如Solaris11、RHEL7、Mac OS X默认都是bash。
IC企业里用tcsh的居多,因为大家原先都在Solaris里干活,老版本的Solaris默认是csh。
在RHEL6、7里,sh软链接指向bash,csh软链接指向tcsh。
zsh很流行,颜色很好看,自动化功能很强大,特别是Oh My Zsh的扩展使用zsh成为了终极shell。可惜的是,很多芯片设计公司服务器没有安装,周围也没有同事用。
EDA安装目录里有ksh脚本,说明有一些IC企业在用ksh,但国内用的人极少。
基于以上的分析,对于普通ICer,我们的结论是:
如果你是普通搬砖的ICer,有啥用啥,周围同事用啥你也用啥。所以bash和tcsh都得学。
如果你是公司的领导(Leader、经理、中层管理等),你让手下用啥,手下就用啥。需要考虑生产力,传统,学习培训成本。
在家,你爱用啥用啥,看着舒服,用着顺手就行。
另外,由于Tcl、Perl、Python等脚本语言的强大,我们只需要了解和掌握shell的常见、简单用法即可。把复杂的编程交给Tcl/Perl/Python去做吧。
shell简易教程
注释
1#thisiscomment
用户配置文件
1#bash 2~/.bashrc 3 4#tcsh 5~/.tcshrc或~/.cshrc 6 7#zsh 8~/.zshrc
脚本第一行指定解释器
1#!/bin/bash 2#!/bin/tcsh 3#!/bin/zsh
变量定义,赋值,引用
1#bash 2CompanyInfo="AIChips,Co.LTD" 3EDA_HOME=/tools/eda 4echo$EDA_HOME 5my_array=(1234) 6echo${my_array[0]}#outputis1 7my_hash['first']=1 8my_hash[second]=2 9echo${my_hash[first]} 10 11#tcsh 12CompanyInfo="AIChips,Co.LTD" 13setEDA_HOME=/tools/eda 14echo$EDA_HOME 15setmy_array=(1234) 16echo$my_array[1]#outputis1 17 18#zsh 19CompanyInfo="AIChips,Co.LTD" 20EDA_HOME=/tools/eda 21echo$EDA_HOME 22my_array=(1234) 23echo$my_array[1]#outputis1 24decare-Amy_hash 25my_hash['first']=1 26my_hash[second]=2 27echo$my_hash[first]
Tips:
#1 bash数组下标从0开始,tcsh和zsh从1开始。
#2 bash引用关联数组用${my_hash[first]},tcsh和zsh不需要{},直接$my_hash[first]。
环境变量
1#bash,zsh 2exportNOVAS_HOME=/tools/eda/synopsys/novas 3或者 4NOVAS_HOME=/tools/eda/synopsys/novas 5exportNOVAS_HOME 6 7#tcsh 8setenvNOVAS_HOME/tools/eda/synopsys/novas
Tips:
#1 tcsh的path数组只对当前shell有效。但如果写在用户配置文件~/.tcshrc里,path也是对所有shell有效的。
条件
1#bash,zsh 2foo="a" 3if[$foo="a"];then 4echo"equal" 5fi 6 7#csh 8setfoo="a" 9if($foo=="a")then 10echo"equal" 11endif
Tips:
#1 考虑兼容性,bash、zsh中的字符串比较用=,而tcsh里用==
#2 bash、zsh的[ ]内部必须有空格
循环
1#bash 2arr=("a""b""c") 3for((i=0;i<${#arr[*]}; i++)) 4do 5 echo ${arr[$i]} 6done 7 8#tcsh 9set arr = (a b c) 10foreach i ($arr) 11 echo $i 12end 13 14#zsh 15arr=("a" "b" "c") 16echo $arr 17for ((i=1; i <= $#arr; i++)) { 18 echo $arr[$i] 19} 20for i ($arr) { 21 echo $i 22}
Tips:
#1 数组长度的表示方式不同,bash里用${#arr[*]}或者${#arr[@]},tcsh和zsh用$#arr
#2 bash用for var in {0..9},tcsh用foreach var ($array),zsh用for var ($array)
函数
1#bash,zsh 2functionsum(){ 3return$(($1+$2)) 4} 5sum12 6echo"sum=$?"
Tips:
#1 函数必须先定义后使用
#2 函数传入参数时,在函数内部用$1, $2, $3等取得
#3 return的返回值保存在内置变量$?里
#4 函数调用时,参数直接写在函数名后面,与linux命令的格式相同
#5 tcsh不支持函数的语法,可以用alias实现类似函数的功能
下面是tcsh里用alias实现类似求和函数sum的例子。alias只是起到简化代码的作用,相当于宏定义。
1#tcsh 2aliassum'@sum=$a+$b';echo$sum 3seta=1 4setb=2 5sum#outputis3 6setb=10 7sum#outputis11
审核编辑:刘清
-
IC设计
+关注
关注
38文章
1297浏览量
104030 -
Linux
+关注
关注
87文章
11312浏览量
209738 -
Shell
+关注
关注
1文章
366浏览量
23403 -
Bash
+关注
关注
0文章
57浏览量
10187
原文标题:IC设计中Linux shell的选择和使用(bash、tcsh、zsh)
文章出处:【微信号:处芯积律,微信公众号:处芯积律】欢迎添加关注!文章转载请注明出处。
发布评论请先 登录
相关推荐
评论