当我们登陆到终端机(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 argunset不能删除只读变量
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。
流程控制!!