当我们登陆到终端机(tty)之后,Linux会依据/etc/passwd中的设置给我指定一个shell(默认是bash,即B-shell),然后就可以使用这个shell做相关的操作了,下面记录bash的详细内容。

shell是面向命令处理的语言,提供的流程控制结构通过对一些内部命令的解释实现

一、一个bash的例子:listdir

#!/bin/sh
if [ $# = 0 ]
then 
  dir=.
else
  dir=$1
fi
find $dir -type d –print

 这里就是列出目录,$#参数个数,$1第一个参数,具体后面详见后面

二、输入重定向

<filename 
从文件filename中获取stdin
例如: sort < telno.txt

三、sh变量

变量存储的是字符串,执行过程中可以被修改,第一个字符是字母,后面是字母数字下划线都可以

    赋值和引用

arg=123321nsad

echo $arg

echo ${arg} 加上了{}可以显式的决定变量的边界

注意赋值的时候等号两边不能加空格,引用的时候用$引用,bash自动完成变量的替换

变量没定义,就是空串

只读变量   

arg=123
readonly arg

这样就不能对于只读变量的值进行修改了

删除变量

unset arg

unset不能删除只读变量

echo命令

echo arg1 arg2 arg3 …

打印各命令行参数,每两个间用一空格分开,最后打印换行符
-e 开启转义,常见的转义有:

c 打印完毕,不换行   退格
 
 换行    回车 	 水平制表 \ 反斜线
 
nn    八进制描述的字符ASCII码

还有printf命令,与c语言的printf很相似

read

从标准输入读入一行内容赋值给变量

read xxx  这样就能把输入的值赋给xxx

字符串

#字符串的拼接
name=liangzhuang
string="thu name is ${name}!"
#获取字符串长度
string="the string"
echo ${#string}
#提取子字符串
echo ${string:1:4}   #输出the 
#查找子字符串的位置
echo `expr index "$string"  t`  # 输出t的匹配的位置

 数组array_name=(value0 value1 value2 value3)array_name[0]=value0

array_name[1]=value1
array_name[n]=valuen
#获得数组元素
valuen=${array_name[n]}
#获得数组的所有元素
echo ${array_name[@]} 
或者
echo ${array_name[*]} #数组长度 ${#array_name[@]} 或者 ${#array_name[
*]} # 取得数组单个元素的长度,就是第n个元素的具体长度 lengthn=${#array_name[n]}

参数传递

$0 为执行的文件名
$i  第i个参数,i超过9 应该为${i}
$# 参数个数
$$ 当前脚本运行的进程号
$- 显示Shell使用的当前选项,与set命令功能相同。
$? 上一条命令是否执行成功 ,0表示成功
$* 与 $@ 都是表示全部参数,前者把参数作为一个字符串,后者保留n个参数的n个字符串

 算数运算符

一般是调用 expr 进行算数运算的
echo `expr $a + $b` 
echo `expr $a * $b`
echo `expr $a / $b` 
echo `expr $a % $b`
#这个每个符号两边都要加空格,除法就是int型的运算规则,截尾

[ $a == $b ]  相等判断
[ $a != $b ]  相等判断
a=$b 赋值

关系运算符

只支持数字,不支持字符串
    [ $a -eq $b ] 
    [ $a -ne $b ] 
    [ $a -gt $b ] 
    [ $a -lt $b ] 
    [ $a -ge $b ]
    [ $a -le $b ]

布尔运算符

    [ ! false ] 返回 true。
    [ $a -lt 20 -o $b -gt 100 ]
    [ $a -lt 20 -a $b -gt 100 ] 

字符串运算符

[ $a = $b ] 
[ $a != $b ] 
[ -z $a ]   长度为0返回true
[ -n $a ]  长度不为0返回true
[ $a ]       不为空返回true

文件测试运算符

-rwx 权限
-s 文件是否为空,不为空为true
-e 检测文件(包括目录)是否存在,如果是,则返回 true-bcdf 文件类型
使用例子
[-r $file] 判断文件是否可读

以上的[] 实际上是与test命令等价的

输入输出重定向

输出重定向会覆盖文件内容,如果不希望文件内容被覆盖,可以使用 >> 追加到文件末尾
ech “追加文字" >> file

#输入重定向
command1 < file1  #把file1作为命令的输入

一般情况下,每个 Unix/Linux 命令运行时都会打开三个文件:
   标准输入文件(stdin):stdin的文件描述符为0,Unix程序默认从stdin读取数据。
   标准输出文件(stdout):stdout 的文件描述符为1,Unix程序默认向stdout输出数据。
   标准错误文件(stderr):stderr的文件描述符为2,Unix程序会向stderr流中写入错误信息。
默认情况下,command > file 将 stdout 重定向到 file,command < file 将stdin 重定向到 file
command 2 >> file       把错误输出 追加到file
command > file 2>&1     先把命令输出重定向到file,在把错误重定向到stdout,此时stdout就是 file
command < file1 >file2  command 命令将 stdin 重定向到 file1,将 stdout 重定向到 file2
command > /dev/null 2>&1 禁止该命令输出任何内容

n>file 将文件描述符为 n 的文件重定向到 file。
n>>file 将文件描述符为 n 的文件以追加的方式重定向到 file。
 

 流程控制!!