Shell 笔记

来源:互联网 发布:湘北山王数据 编辑:程序博客网 时间:2024/06/01 09:39

Linux的Shell种类众多,常见的有:Bourne Shell(/usr/bin/sh或/bin/sh)、
Bourne Again Shell(/bin/bash)、C Shell(/usr/bin/csh)、
K Shell(/usr/bin/ksh)、Shell for Root(/sbin/sh),等等, 
较为通用的Shell有标准的Bourne shell (sh)和C shell (csh)
不同的Shell语言不能交换使用。

执行一个脚本一般有三种方法:
1.将该脚本权限设置为可执行,直接用脚本的名字执行。
chmod +x scriptName 为脚本增加可执行权限
2. . filename ,点空格filename,这样就默认使用sh执行该脚本,并且不生成子shell, 是在当前shell下运行,不用设置可执行权限。
3.sh filename (生成子shell,在该种模式下常用于调试脚本,
如sh -x filename,也不用设置可执行权限)。

3点需要补充的是,sh filename是针对sh,ksh的,对于csh需要用source filename
exec命令启动一个脚本,不会启动子shell,使用这一命令时任何现有环境都将会
被清除, 并践踏你当前的shell,当这个脚本结束,该shell将被关闭,并重新回
到登陆符。
脚本是由shell终端fork产生的子shell执行的,所以脚本执行完毕子shell也结束,
因而返回父shell也就是当前的终端,"跳转目录"只是在子shell存活期间生效,
也就是说你的shell脚本可能需要切换到其他目录但是这并不影响当前的shell
(父shell)的目录。

语法:
Shell Script是一种弱类型语言,使用变量无需声明其类型。
a="HelloShell!\n"  注意:等号‘=’两边不能有空格。

echo输出 在字符串中输出某一变量
a="Hello"
echo "${a}Shell!\n"  输出为 HelloShell!
echo "$aShell!\n"    输出为 Shell!\n
注意:$aShell将会被看做一个整体,该变量为空。另外,单引号中的变量不会进行变量替换操作。 

num=2
echo "this is the {$num}nd" 输出为 this is the {2}nd
var=1
var=$var+1
echo $var
打印出来的不是2而是1+1。为了达到我们想要的效果有以下几种表达方式:
let "var+=1"
var=$[$var+1]    
var=$(($var+1))    
var=`expr $var + 1`
#注意加号两边的空格,否则还是按照字符串的方式赋值,`为Esc下方的`,而不是单引号'。
注意:前两种方式在bash下有效,在sh下会出错。

let表示数学运算,expr用于整数值运算,每一项用空格隔开,$[]将中括号内的表达式作为数学运算先计算结果再输出。

除了只在脚本内有效的普通shell变量外,还有环境变量,即那些由export关键字处理过的变量。
本文不讨论环境变量,因为它们一般只在登录脚本中用到。

#注释行

if语句和其他编程语言相似,都是流程控制语句。它的语法是:
if …; then

elif …; then

else

fi


if语句的条件部分要以分号‘;’来分隔。
[]表示条件测试,常用的条件测试有下面几种:
[ -f "$file" ] 判断$file是否是一个文件
[ $a -lt 3 ] 判断$a的值是否小于3,同样-gt和-le分别表示大于或小于等于
[ -x "$file" ] 判断$file是否存在且有可执行权限,同样-r测试文件可读性
[ -n "$a" ] 判断变量$a是否有值,测试空串用-z
[ "$a" = "$b" ] 判断$a和$b的取值是否相等
[ cond1 -a cond2 ] 判断cond1和cond2是否同时成立,-o表示cond1和cond2有一成立
要注意条件测试部分中的空格。在方括号的两侧都有空格,在-f、-lt、=等符号两侧同样也有空格。
如果没有这些空格,Shell解释脚本的时候就会出错。


$# 传递到脚本的参数个数
$* 以一个单字符串显示所有向脚本传递的参数
$$ 脚本运行的ID号
$! 后台运行的最后一个进程的ID号
$@ 与$#相同,但是使用时加引号,并在引号中返回每个参数。
$- 显示shell使用的当前选项。
$? 显示最后命令的推出状况。0表示没有错误。 
$0 表示脚本的名字。
$1,$2...,${10},${11} 表示参数列表。


单引号(''):不进行任何的变量替换,保持字符串的原始值双引号(""):以变量的值来替换,并作为字符串的一部分
反引号(``):用于进行命令替换,引号中命令的执行结果将替换命令本身作为字符串


循环
  for var in 列表; do
  done
 
  while [条件]; do
  done


读入
  read var1 var2 ...


退出当前进程
exit 0 


数组声明:
array[key]=value

 -r file #用户可读为真
 -w file #用户可写为真
 -x file #用户可执行为真
 -f file #文件存在且为正规文件为真
 -d file #如果是存在目录为真
 -c file #文件存在且为字符设备文件
 -b file #文件存在且为块设备文件
 -s file #文件大小为非0为真,可以判断文件是否为空
 -e file #如果文件存在为真

关于EUID:linux系统中每个进程都有2个ID,分别为用户ID(uid)和有效用户ID(euid),UID一般表示进程的创建者(属于哪个用户创建),而EUID表示进程对于文件和资源的访问权限(具备等同于哪个用户的权限)。一般情况下2个ID是相同的。

eval  e.g.
abc123=google.com
a=abc
b=123
eval t=$"$a$b"
echo t  为 google.com

参考:

http://www.cnblogs.com/suyang/archive/2008/05/18/1201990.html
http://bbs.chinaunix.net/thread-1820454-1-1.html
http://laigq.itpub.net/post/40112/487908
http://wiki.ubuntu.org.cn/Shell%E7%BC%96%E7%A8%8B%E5%9F%BA%E7%A1%80