shell简单教程

来源:互联网 发布:mac奶油橘色口红试色 编辑:程序博客网 时间:2024/06/06 01:09

 

交互Shell : 是指用户在提示符下输命令的Shell,       自动执行~/.bashrc脚本

登录Shell : 是在输入用户名和密码登录后得到的Shell

PS:

从图形界面的窗口管理器登录之后会显示桌面不会产生登录Shell(也不会执行启动脚本),

在图形界面下打开终端窗口得到的Shell也不是登录Shell。

 

启动bash会自动执行以下脚本:

1 首先执行/etc/profile,系统中每个用户登录时都要执行这个脚本

2 然后依次查找当前用户主目录的~/.bash_profile、~/.bash_login和~/.profile三个文件

PS:

bash规定首先查找以~/.bash_开头的启动脚本,如果没有则执行~/.profile,是为了和sh保持一致。

顺便一提,在退出登录时会执行~/.bash_logout脚本(如果它存在的话)。

 

表 31.2. 测试命令

[ -d DIR ]        如果DIR存在并且是一个目录则为真

[ -f FILE ]        如果FILE存在且是一个普通文件则为真

[ -z STRING ]    如果STRING的长度为零则为真

[ -n STRING ]    如果STRING的长度非零则为真

[ STRING1 = STRING2 ]如果两个字符串相同则为真

[ STRING1 != STRING2 ]如果字符串不相同则为真

[ ARG1 OP ARG2 ]    ARG1和ARG2应该是整数或者取值为整数的变量,OP是-eq(等于)-ne(不等于)-lt(小于)-le(小于等于)

                        -gt(大于)-ge(大于等于)之中的一个

 

表 31.3. 带与、或、非的测试命令

[ ! EXPR ]        EXPR可以是上表中的任意一种测试条件,!表示逻辑反

[ EXPR1 -a EXPR2 ]EXPR1和EXPR2可以是上表中的任意一种测试条件,-a表示逻辑与

[ EXPR1 -o EXPR2 ]EXPR1和EXPR2可以是上表中的任意一种测试条件,-o表示逻辑或

 

结构控制if/then/elif/else/fi

 : 是一个特殊的命令,称为空命令,该命令不做任何事,但Exit Status总是真

read命令的作用是等待用户输入一行字符串,将该字符串存到一个Shell变量中

= 在条件判断里表示是否相等的判断

Shell还提供了&&和||语法,和C语言类似,具有Short-circuit特性

 

结构控制case/esac

而Shell脚本的case可以匹配字符串和Wildcard,每个匹配分支可以有若干条命令,末尾必须以;;结束,

执行时找到第一个匹配的分支并执行相应的命令,然后直接跳到esac之后,不需要像C语言一样用break跳出。

 

结构控制for/do/done

for FRUIT in apple banana pear; do

  echo "I like $FRUIT"

done

 

结构控制while/do/done

COUNTER=1

while [ "$COUNTER" -lt 10 ]; do

  echo "Here we go again"

  COUNTER=$(($COUNTER+1))

done

 

表 31.4. 常用的位置参数和特殊变量

$0相当于C语言main函数的argv[0]

$1、$2...这些称为位置参数(Positional Parameter),相当于C语言main函数的argv[1]、argv[2]...

$#相当于C语言main函数的argc - 1,注意这里的#后面不表示注释

$@表示参数列表"$1" "$2" ...,例如可以用在for循环中的in后面。

$?上一条命令的Exit Status

$$当前Shell的进程号

 

@@@@@@@@

位置参数可以用shift命令左移。

比如shift 3表示原来的$4现在变成$1,原来的$5现在变成$2等等,原来的$1、$2、$3丢弃,$0不移动。

不带参数的shift命令相当于shift 1

@@@@@@@@

 

注意函数体的左花括号{和后面的命令之间必须有空格或换行,

如果将最后一条命令和右花括号}写在同一行,命令末尾必须有;号。

用foo函数的时候才执行函数体中的命令。

注意Shell中的函数调用不写括号.

Shell脚本中的函数必须先定义后调用,

调用函数时可以传任意个参数,在函数内同样是用$0、$1、$2等变量来提取参数,函数中的位置参数相当于函数的局部变量,

改变这些变量并不会影响函数外面的$0、$1、$2等变量。函数中可以用return命令返回,如果return后面跟一个数字则表示函数的Exit Status。

 

Shell提供了一些用于调试脚本的选项,如下所示:

-n 读一遍脚本中的命令但不执行,用于检查脚本中的语法错误

-v 一边执行脚本,一边将执行过的脚本命令打印到标准错误输出

-x 提供跟踪执行信息,将执行的每一条命令和结果依次打印出来

 

在命令行提供参数

$ sh -x ./script.sh

二是在脚本开头提供参数

#! /bin/sh -x

第三种方法是在脚本中用set命令启用或禁用参数

#! /bin/sh

if [ -z "$1" ]; then

  set -x

  echo "ERROR: Insufficient Args."

  exit 1

  set +x

fi

set -x和set +x分别表示启用和禁用-x参数,这样可以只对脚本中的某一段进行跟踪调试

 

%%%%%%%%%%% 正则表达式 %%%%%%%%%%%%