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 基本概念及编程(1)_管理系统

查看一个LINUX支持哪些SHELL,可以用 cat /etc/shells

Linux Shell 基本概念及编程(1)_空间_02

那么一个SHELL是如何读取一个命令,并将这个命令解析并执行的呢?如下图所示:

Linux Shell 基本概念及编程(1)_空间_03

首先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 (运算符) ==,!= ,>,&gt;=,<,&lt;= =,!= ,-e –a,-gt -ge =,!=,==,!=,&&,||,!,>,&gt;=,<,&lt;= ==,!=,&&,||,!,>,&gt;=,&lt;,&lt;=
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