什么是shell?
什么是脚本?
就是一些文件,我们能将一系列需要执行的命令写入其中,然后通过shell来执行这些脚本。通常使用某种基于解释其的编程语言。
一般shell脚本是以一个#!为开头的文本文件,如#!/bin/bash,/bin/bash是bash的路径。运行脚本文件方式如下:
$ sh script.sh 或者 # sh script.sh #该命令行默认该脚本在该目录下,也可以使用以“./” 或“/”开头的相对路径和绝对路径表示方式
区别在于,前者$代表普通权限用户,#代表root权限用户。后半部分以#开始,代表注释。
对shell脚本有了初步认识后,开始正式进入shell脚本正文。
1.终端打印
$echo 要打印的字符串
echo后面有三种方式:
1,echo welcom to bash
2,echo ‘welcom to bash‘
3,echo "welcom to bash"
一般三种方式都可以,但略有些差别。
1,脚本中,以echo hello为例,echo hello将被作为一个命令行处理,同时hello也会被作为一个命令行处理,但是第二种加单引号就不会有这种情况,‘hello’只会被 作为一个字符串打印出来
2,双引号中,要注意用转意符‘\’显示一些有特殊意义的符号
$printf "要打印的字符串" #可以打印含有格式信息的字符串
2.环境变量
设置变量:var=value 或者 var="value",区别在于前者写法不能有空格,否则两种方式是一样的
读取变量值:$var 或者 ${var}
export命令用来设置环境变量,从当前shell脚本执行的任何程序都会继承这个变量。如 $ export PATH="$PATH:/home/user/bin",这样就把/home/user/bin添加到了 PATH中
变量长度:length=${#var}
使用$ echo $SHELL可以知道当前所使用的shell版本
3.通过shell进行数学运算
可以利用let、(( ))和[]执行基本的算数操作。高级操作的话,有expr和br两个工具可以使用。
从let的含义就可以知道其作用了,放在一个数学表达式的开始,如
$no1 = 4; no2 = 5;
$let result = no1 + no2 ,或者 $ result = $[no1 + no2],或者 $result = $((no1 + no2)) #前面必须要加"$",因为否则就不是赋数值了
4.文件描述附,重定向
0---stdin
1---stdout
2---stderr
">"可以把左边输出内容重定向到右边的流中,文本的话是以覆盖形式。与之对应,“>>”则是一种追加的形式。
在命令行中,可以同时写“1>”和“2>”,前者是标准输出,后者是错误输出,这样就可以把标准输出跟错误输出分别保存到两个文本中。
另一个相关的命令是tee,它可以既把输出信息输出到一个文件里,同时把该信息做一个拷贝,然后作为后续命令的stdin使用,需要配合管道“|”使用,具体用法此处略去。
自定义文件描述符:选择一个不小于3的数字与>、>>、<、<<结合,后跟一个输入/输出文件名。
5.数组和关联数组
普通数组:只能使用整数作为索引
array_var=(1 2 3 4 5 6),可以像array_var[0]="test0"的方式读取
关联数组:可以使用字符串作为索引,相当与一个{key, value}的map
$ declare -A ass_array #将一个变量名声明为关联数组
$ ass_array=([index1]=val1 [index2]=val2) #index1,index2是字符串索引
6.使用别名
别名,顾名思义了。
直接举例:$alias new_command=‘original command sequence‘,这样就可以只用new_command来代替original command sequence来执行了
安全问题:$ \command,忽略当前定义过的所有别名,运行原本的命令,以防某些特权命令被别有用心的利用别名替换掉了。
7.获取终端信息
有两个工具:tput,stty可以手机、处理终端设置,具体用法此处省略。
8.获取、设置日期和延时
读取日期:$date
打印纪元时:date +%s
有一些输出格式,%a,A,b,B,d,D,y,Y,I,M,S,N,s,具体含义在此就不一一列举了,用到时可以查询。
打印时间:$ date "+%d %B %Y"
设置时间:$date -s "格式化的日期字符"
9.调试脚本
几个选项:
-x:执行时显示参数和命令
+x:禁止调试
-v:当命令进行读取时显示输入
+v:禁止打印输入
10.函数和参数
定义函数:function关键字可有可无
function fname() #函数体内可以使用$1...$n等表示第几个传进的参数
{
statements;
}
使用:$fname arg1 arg2; #执行函数,也可以进行传参
11.以不按回车键方式读取字符“n”
read命令提供了一种不需要按回车键就能搞定这个任务的方法。注:因为一般键盘输入都是以回车符作为结束的标志,但有时候是无法提供回车符的,或者很不方便。
12.循环、条件指令
for var in list
do
commands;
done
或者
for((i=0;i<10;i++))
{
commands;
}
until[条件]
if condition
then
commands
elif condition
then
commands
else
commands
fi
细节还有很多,在此就省略了。
原文:http://www.cnblogs.com/boole/p/3605568.html