Shell是操作系统的一个概念,在Windows上也有命令行,现在Win7有更强大的PowerShell,Linux虽然操作系统上很多底层代码重新编写了,与UNIX完全不同,但毕竟它是继承UNIX下来的,对UNIX的最早的Bourne Shell(AT&T刚开始开发就有)及C Shell(在Berkeley 大学开发)以及Korn Shell等都支持。但常见默认的是Bourne agani Shell。 与Bourne Shell相同,但有所增加。Shell作为系统内核之上用户空间与内核空间的桥梁,其作用非常重要。没有Shell,你开发的应用无法运行,没有SHELL你也无法管理系统内核。如下图是SHELL的基本历史。
查看一个LINUX支持哪些SHELL,可以用 cat /etc/shells
那么一个SHELL是如何读取一个命令,并将这个命令解析并执行的呢?如下图所示:
首先Shell会解析输入的命令字符串,并分解开来取第一个字符串,进行判断,如果第一个字符串是内部命令,直接执行。如果是外部应用,创建一个新进程进行执行。否则退出。
我们前面知道目前LINUX存在不同的SHELL,那么每种SHELL在日常使用中,特别是语法中有哪些不同呢。这里有一个列表,用来列出一些关键的不同。
不同SHELL的语法和结构区别
C和TC Shell | sh | Korn Shell | Bash Shell | |
shbang line(第一行申明) | #!/bin/csh 或者!#/bin/tcsh | #/bin/sh | #!/bin/ksh | #!/bin/bash |
Comments(注释行) | #This is a comments | #this text is not #interpreted by the shell | #This program will test some files | #This is a comment |
Wildcards (通配符) | rm *; ls ??; cat file[1-3];!! | echo “How are you?” | rm *; ls ??;cat file[1-3];echo “How are you?” | rm *;ls ??; cat file[1-3]; echo “How are you?” |
Displaying Output(标准输出) | echo “Hello to you\!” | echo “What is your name?” | echo “Who are you?” print “How are you?” | echo “How are you?” |
Local Variables (局部变量)(只在当前SHELL环境中可用) | set variable_name = value set name = “Tom Jones” | variable_name=value name=”John Doe” x=5 | variable_name = value typeset variable_name = value name = “John Doe” | variable_name =value declare variable_name =value |
Global Variables(全局变量)(在当前SHELL及其子SHELL环境中可用) | setenv VARIBLE_NAME value setenv PRINTER Shakespere | VARIABLE_NAME=value export VARIABLE_NAME | export VARIABLE_NAME=value export PATH=/bin:/usr/bin:. | export VARIABLE_NAM=value |
Extracting values from variables(变量取值) | echo $variable_name echo $name echo $PRINTER | echo $variable_name echo $name | echo $variable_name echo $name | echo $variable_name echo $name |
Reading user input (读取用户输入) | echo “What’s your name?” set name =$< | echo “what’s your name?” read name read name1 name2 | print –n “What’s your name?” read name | echo “What’s your name?” read name read name 1 name 2… |
Arguments (用户输入参数) | scriptnme arg1 arg2 arg3….. echo $1 $2 $3 echo $* | $scriptname arg1 arg2 arg3 …. echo $1 $2 $3 | $scriptname arg1 arg2 arg3 echo $1 $2 $3 | $scriptname arg1 arg2 arg3 echo $1 $2 $3 echo $* echo $# |
Arrays(数组) | set word_list =(word1 word2 word3) echo $word_list[2] echo $word_list[1] echo $word_list or $word_list[*] | set word1 word2 word 3 echo $1 $2 $3 | set apples pears peaches print $1 $2 $3 | set apples pears peaches echo $1 $2 $3 |
Shell command substitution (命令替换) | set variable_name =`command` echo $variable_name | variable_name=`command` echo $variable_name | variable_name =`command` variable_name = $(command) echo $variable_name | variable_name=`command` variable_name=$(command) echo $variable_name |
Arithmetic(计算) | @n=5+5 echo $n | n=`expr 5+5` echo $n | typeset –i variable_name | declare –i variable_name typeset –i variable_name ((n=5+5)) echo $n |
operations (运算符) | ==,!= ,>,>=,<,<= | =,!= ,-e –a,-gt -ge | =,!=,==,!=,&&,||,!,>,>=,<,<= | ==,!=,&&,||,!,>,>=,<,<= |
File testing(文件测试) | -r, 文件可读 –w, 文件可写 -x, 文件可执行 -e, 文件存在 -o, 当前用户Own -z,文件0长度 -d 文件是目录 -f 是文件,非目录 | -r, 文件可读 –w, 文件可写 -x, 文件可执行 -o, 当前用户Own -s,文件非0长度 -d 文件是目录 -f 是文件,非目录 | -r, 文件可读 –w, 文件可写 -x, 文件可执行 -s,文件非0长度 -d 文件是目录 -a 文件存在,且非目录 | |
Functions | function a |