shell入门学习笔记

一、shell脚本的定义

1、shell的定义

shell,是一个命令行解释器。在计算机领域中,俗称壳,用来区别于核(如linux是内核,shell则是用户与linux之间的接口),是指提供使用者使用界面的软件(命令解析器)。类似于dos下的command和后来的cmd.exe。shell接收用户命令,然后调用相应的应用程序。--百度百科

shell是脚本语言,即解释型语言。

2、shell几种常见的类型

sh,Bourne Shell的缩写,sh是unix标准默认的shell。

bash,Bourne Again Shell的缩写,bash是linux标准默认的shell,bash完全兼容了sh。

还有ash、csh、tcsh、ksh等

3、shell有2中执行命令的方式

交互式:解释执行用户的命令,用户在界面输入一条命令,shell就执行一条

批处理:用户先把(一条或多条)命令写成一个shell脚本(script),执行sh脚本,shell会一次性把sh脚本的所有命令执行完。

二、shell变量

1、变量的定义、赋值及使用

定义/赋值:variableName=“value”,注:赋值时,变量名与等号之间不能有空格。

使用:${variableName},大括号可省略,但在变量名后面有带其他字符串时,大括号必须保留。如${variableName}Script

2、只读属性

readonly命令可以将变量定义为只读变量。如:readonly variableName

3、删除

unset,删除命令(不能删除只读变量)。unset variableName

4、特殊变量

$0,当前脚本的文件名。如在脚本中echo $0,就可以输出当前脚本的文件名称。

$n,传递给脚本或函数的第n个参数。n是数字。如执行文件时:sh ./test.sh java,则在shell脚本中$1就能获取到java

$#,传递给脚本或函数的参数个数。返回一个数字,参数数量总数。

$*和$@,传递给脚本或函数的所有参数。

在没有双引号包含时,效果等同于$@,都是以"$1""$2"..."$n"的格式输出所有参数,$@有没有双引号都是同样的输出格式。

有双引号包含时,$*是作为一个整体输出,"$1 $2 ... $n"。

$?,上个命令的退出状态(成功返回0,失败返回1或其他数字),或函数的返回值。

$$,当前shell进程ID。

5、变量的替换与转义符

echo命令中,-E选项是禁止转义,默认也是不转义的。-e表示对转义字符进行替换。

如:

a=10

echo -e "Value of a is $a  \n"   会输出:Value of a is 10

echo "Value of a is $a \n"     会输出:Value of a is 10 \n

转义符:

\\,反斜杠

\a,警报,响铃

\b,退格(删除键)

\f,换页FF,将当前位置移到下页开头

\n,换行

\r,回车

\t,水平制表符(tab键)

\v,垂直制表符

6、命令替换

命令替换是指shell可以先执行命令,将输出结果暂时保存,在适当的地方输出。

语法:`command`    (命令使用反引号包含)

#! /bin/bash

DATE=`date`

echo "Date is $DATE"将会输出Date is  ...(当前日期)

赋值命令替换的时候:赋值是先执行命令,把命令执行后的值赋给变量;而不是把命令本身赋给变量。

如:

d=`date +%H:%M:%S`       

echo "the script begin at $d"  

执行结果是(sh –x选项,方便调试,会先打出一行命令,再打出执行命令的结果):

++ date +%H:%M:%S
+ d=16:57:07
+ echo 'the script begin at 16:57:07'
the script begin at 16:57:07

7、变量替换

变量替换可以根据变量的状态(是否为空、是否定义等)来改变它的值。

${var},变量本来的值

${var:-word},如果变量var为空或已被删除(unset),那么返回word,但不改变var的值。

${var:+word},如果变量var被定义,那么返回word,但不会改变var的值。

${var:=word},如果变量var为空或已被删除(unset),那么返回word,并将var的值设置为word。

${var:?message},如果变量var为空或已给删除(unset),那么将消息message送到标准错误输出,可以用来检测变量var是否可以被正常赋值。若此替换出现在shell脚本中,那么脚本将停止运行。

三、shell运算符

bash可以支持运算符(可使用命令awk、expr),包括算数运算符、关系运算符、布尔运算符、字符串运算符和文件测试运算符。

expr是一款表达式计算工具,使用expr能完成表达式的求值操作。

注:运算时,表达式和运算符之间要有空格。

1、算数运算符,8个

+、-、*、/、%:加减乘除取余,如:val=`expr $a + $b`               echo "$val"  输出结果就是a+b的和。其他同理。

=、==:赋值、数字相等则返回true,!= 数字不相等则返回true。a=$b把b的值赋给a;[$a == $b]若相等返回true。

数学计算要用[]括起来,且在外头带一个$。如:sum=$[ $a + $b ]

2、关系运算符,6个

关系运算符只支持数字,不支持字符串。

-eq:两个数字相等则返回true。[ $a -eq $b ],若a、b相等,则返回true。

-ne:两个数字不相等则返回true。[ $a -ne $b ],若a、b相等,则返回false,若不相等则返回true。

-gt:左边大于右边,则返回true。[ $a -gt $b ]

-lt:左边小于右边,则返回true。

-ge:左边大于或等于右边,则返回true。

-le:左边小于或等于右边,则返回true。

3、布尔运算符列表,3个

!:非。[ ! false ]则返回true。

-o:或,or。[ $a -lt 20 -o $b -gt 100 ],两个条件中任一个为true,则表达式就返回true。

-a:与,and。

4、字符串运算符列表,5个

=:两个字符串相等,则返回true。[ $a = $b ]

!=:两个字符串不相等,则返回true。  [ $a != $b ]

-z:字符串长度为0,则返回true。  [ -z $a ]

-n:字符串长度不为0,则返回true。  [ -n $a ]

str:字符串不为空,则返回true。  [ $a ]

5、文件测试运算符列表

-b file:检测文件是否块设备文件,如果是,则返回true。

-c file:若文件是字符设备文件,则返回true。

-d file:若文件是目录,则返回true

-f file:若文件是普通文件(非目录、非设备文件则是普通文件),则返回true。

-g file:若文件设置了SGID位,则返回true。

-k file:若文件设置了粘着位(Sticky Bit),则返回true。

-p file:若文件是具名管道,则返回true。

-u file:若文件设置了SUID位,则返回true。

-r file:若文件可读,则返回true。-w file:若文件可写,则返回true。-x file:若文件可执行,则返回true

-s file:若文件大小大于0,则返回true

-e file:若文件/目录存在,则返回true

四、字符串

1、单引号

单引号内的任何字符都会原样输出,所以单引号字符串中的变量是无效的。单引号字符串中不能出现单引号,哪怕用了转义符也不行。

2、双引号

双引号内的字符串支持变量、转义字符、命令等。name='world'       str="Hello, \" ${name} \" ! \n"

3、字符串操作

获取字符串长度:echo ${#variable_name}

提取子字符串(bash中是从0开始数): echo ${variable:1:4}   ,从第一位开始获取长度为4的子字符串。

五、数组

bash支持一维数组(不支持多维数组),bash没有限定数组的大小,数组元素的下标由0开始编号。数组元素用空格或换行分隔。

赋值:array_name=(value0 value1 value2 value3)或  array_name[0]=value0等

读取:${array_name[index]},如:val=${array_name[3]}   或   echo "First Index: ${array_name[0]}"

${array_name[*]} 或  ${array_name[@]}  ,可以获取字符数组的所有元素。

数组元素个数:length=${#array_name[@]}

数组单个元素的长度:length_n=${#array_name[n]}

六、相关命令

echo:

printf:用于格式化输出,是echo的增强版。printf不自动换行。printf   format-string [arguments]

printf %s abc def   :会输出 abcdef

if:  格式为    if  [...]  then ... elif [...] then ... else ... fi

a) if [ $a –lt 5 ] then……    如果条件使用[],就不能使用< > =这些符号,要使用-lt –gt –le –ge –eq –ne等

b) if ((a<5)); then……

c) for I in `seq 1 5`; do ……    seq 1 5表示从1到5 的序列。

case :   case  $variable_name in ...   ;;     esac

for循环、while循环、until循环、break跳出循环、continue跳出循环

文件包含:在shell脚本中可以包含外部脚本,将外部脚本合并到当前脚本。使用方式:  . filename    或者  source filename  (被包含脚本不需要有执行权限)

重定向:

<:输入重定向

<<:表示当前标准输入来自命令行的一对分隔号的中间内容

>:输出重定向,如果文件不存在,会新建一个;如果文件存在,会覆盖

>>:输出重定向,如果文件存在,则追加在该文件的内容后面。

常用文件重定向命令 
command > filename 把标准输出重定向到一个新文件中 
command >> filename 把标准输出重定向到一个文件中(追加) 
command 1 > fielname 把标准输出重定向到一个文件中 
command > filename 2>&1 把标准输出和标准错误一起重定向到一个文件中 
command 2> filename 把标准错误重定向到一个文件中 
command 2>> filename 把标准输出重定向到一个文件中(追加) 
command >> filename 2>&1 把标准输出和标准错误一起重定向到一个文件中(追加) 
command < filename >filename2 把c o m m a n d命令以f i l e n a m e文件作为标准输入,以f i l e n a m e 2文件作为标准输出 
command < filename 把c o m m a n d命令以f i l e n a m e文件作为标准输入 
command << delimiter 把从标准输入中读入,直至遇到d e l i m i t e r分界符 
command <&m 把文件描述符m作为标准输入 
command >&m 把标准输出重定向到文件描述符m中 
command <&- 关闭标准输入  



参考:http://huaijin.iteye.com/blog/1021339

http://c.biancheng.net/cpp/view/2738.html




你可能感兴趣的:(运维相关,shell,脚本,函数,bash,脚本语言)