shell--1.shell 相关及变量

1.shell脚本解释器

Bourme Shell (/usr/bin/sh 或 /bin/sh )
Bourme Again Shell ( /bin/bash )
C Shell ( /usr/bin/csh )
K Shell ( /usr/bin/ksh )
shell for Root ( /sbin/sh)

bash 由于易用和免费,所以在开发环境中广泛应用

2.第一个shell 脚本

#!/bin/bash
echo "Hello World"

#! 是一个约定的标记,它告诉系统这个脚本需要什么解释器来执行。

3.运行脚本有2种方法,
(1) 一种就是把上面的内容保存到test.sh

chmod +x test.sh
./test.sh

(2)另一种是直接运行解释器,其参数就是上面保存的文件名

/bin/sh test.sh

/bin/bash test.sh

这种方式不需要在脚本写解释器信息(#!/bin/bash),写了也没用

4. shell变量

(1)定义规则:
(1) 可以包含字母,数字,下划线,不能有标点符号
(2) 必须以字母或者下划线开头
(3) 大小写敏感
(4) 不能包含bash里面的关键字

(2)使用变量
使用一个定义过的变量,只需在前面加一个$符号
如:

myname="lvyf"
echo "$myname"
ecoh "${myname}"

花括号加不加都行,加上花括号,是让解释器识别变量的边界,如:

echo "this is myname $mynameHaha"
这种 情况不加花括号,解释器就会认为mynameHaha是一个量
正确写法
echo "this is myname ${myname}Haha"

(3)重新赋值

myname="lvyf"
echo "${myname}"
myname="lvyafei"
echo "${myname}"

第二次赋值的时候不用加$ ,只有使用变量的时候才加$符号

(4) 只读变量

myname="lvyf"
echo "${myname}"
readonly myname
myname="lvyafei"

执行会报错:./first_shell.sh:行8: myname: 只读变量

(5) 删除变量

unset myname
echo ${myname}

不会输出任何东西

(6) 变量类型
  1)局部变量:在脚本或命令中定义,仅在当前shell实例中有效,其它shell不能访问该局部变量
  2)环境变量:所有的程序,包括shell启动程序都要访问环境变量,有些程序需要环境变量保证其正确运行,如在脚本执行启动nginx,那么环境变量必须要有nginx的相关配置
  3)shell变量:是由shell程序设置的特殊变量。有一部分是环境变量有一部分是局部变量,这此变量保证了shell的正常运行。

5. shell字符串,字符串可能用单引号,双引号,也可以不用引号

(1) 单引号
  1)单引号里所有的字符都会原样输出
  2)单引号的变量是无效的如

str1='abc'
str2='hello ${str1} '
这段会输出 hello ${str1}

3)单引号里面不可有单引号,转义字符单引号(\')也不行

(2) 双引号
1)双引号可以有变量
2)双引号可以出现转义字符

str="lvyf"
echo "hello \"${str}\" heheh"
输出:hello "lvyf" heheh

(3) 反引号 ` 1左边的按键

反引号里面包含的一般是命令,给当前正在执行的shell强制插入命令,如:

str="lvyf"
echo "hello \"${str}\" heheh `date`"
date就是获取当前时间的命令,打印: hello "lvyf" heheh 2016年 07月 25日 星期一 18:22:47 CST

(4) 拼接字符串

your_name="lvyafei"
greeting="hello ${your_name}"
echo ${greeting}

(5) 获取字符串长度

echo ${#greeting} #输出13

(6) 截取字符串
从第1个字符开始,截取5个字符:

echo ${greeting:0:5} #输出hello

6. shell 数组

  1)定义数组
shell中,用括号表示数组,数组元素用空格分开,定义数组的一般形式

arrt_name=(val1 val2 val3)

或者
arry_name=(val1
var2
val3
val4
) 或者
arry_name[0]=val1
arry_name[3]=val3
可以不使用连续的下标,而且下标范围没有限制

  2)读取数组

${arry_name[0]}

使用@读取数组所有的元素

arry[1]=10
arry[3]=20
echo ${arry[@]} # 打印出10 20

  3)获取数组长度

${#arry_name[@]}
${#arry_name[*]}
${#arry_name[n]}

7.shell 注释 ###

8.shell 参数传递

1)$# 传递到脚本的参数个数
2)$* 传递到脚本的所有参数
3)$@ 传递到脚本的所有参数
4)$? 显示最后命令的退出状态,0表示没有错误,其它任何数字都表示有问题

5)$$ 脚本运行的当前进程的id号
6)$! 后台运行的最后一个进程的id号
7)$-显示Shell使用的当前选项,与set命令功能相同。

$* 和 $@ 的区别
如果传了3个参数 a,b,c ,使用$* 认为就传了一个参数abc 而使用$@ 会认为传了3个参数 a , b ,c
上一篇:BZOJ 1070 拆点 费用流


下一篇:Linux系统编程(33)—— socket编程之TCP程序的错误处理