为什么要使用scripts呢? 简单的应用就是,你可以将一些在command line下达的连续指令写入到scripts之中,然后直接执行scripts就可以达到连续执行指令的目的。说到这里又必须提到一个注意事项,就是脚本文件不一定都是.sh结尾的,只不过这样便于分类,自己和别人使用起来也会更加方便。可以使用任何一种文字编辑器进行编辑,必须以
#!/bin/sh 作为第一行, #!符号是用来告诉系统执行该脚本的程序。
编辑结束并保存后,如果要执行该脚本,必须先使其可执行: chmod +x filename
然后再在该脚本所在的目录下,输入 ./filename即可
3.Shell命令和流程控制
############这个部分暂时不用太深究
3) 流程控制
if [ 条件判断一 ] && (||) [ 条件判断二 ]; then
执行内容程序
elseif [ 条件判断三 ] && (||) [ 条件判断四 ]; then
执行第二段内容程序
else
执行第三段内容程序
fi
举个例子(这个例子可能太简单,具体的其他例子再好好探究)
if [ $buffer = 5M ]
d.loop循环
(1). while-loop循环
while ... ; do
...
done
当while的判断为真时,就执行loop里面的内容。break和continue的作用和java一样
(2). for-loop循环
查看一个字符串列表 (字符串用空格分隔),然后将其赋给一个变量
for var in ...; do
...
done
e. select表达式
4.引号
有时候会遇到有通配符,比如说某个目录下有2个jpg文件,hei.jpg和moi.jpg,
输出若为 echo *.jpg就会把2个的名字都打印出来。如果不想发生这种情况,就使用引号,确切的说是单引号。暂时不讨论那么多,记住就ok。
5.函数
拿帮助函数来举例子,我写一个help函数,然后当你输入一个东西的时候我就给你显示出来我定义好的帮助信息。
函数必须事先进行声明
functionname()
{
body
}
6.卷标与运算符号 : declare
因为bash默认的变量类型为字符串类型,所以如果比如你想进行数学运算,就不能直接进行,假如你写了3*5,输出来的还是3*5,不会是15。怎么办呢???声明。。。怎么声明???declare命令
declare [-afirx]
具体每一个是什么意思用的时候再查了,举个例子吧
declare -i a=3
declare -i number=2*3+5*13-32+25
7.关于一个输入参数的问题
有时候需要用户从输入设备上来输入一些参数,从而达到赋值的作用,举例:
echo "this script name is $0"
echo "some other parameters are $1 $2 $3"
那么在你运行的时候,就是 ./XXX.sh 的时候,后面要加上 name pa1 pa2 pa3
这样就会显示出来,相当于是交互式的
还有一种,不需要参数标号,就输入一次,那就是read,比如你写一句read name,那么就自动有一个叫name的参数,可以使用。(只是我现在不知道它到底是临时的还是永久的,存在哪里的,存多久???)
8.总结
1) 任何优秀的脚本都应该具有帮助和输入参数
2) 任何优秀的脚本都应该写一个伪脚本(framework.sh),该脚本包含了大多数脚本都需要的框架结构。这样我们在写一个新的脚本时,只需要执行copy命令,然后进行一些添加和修改
编辑结束并保存后,如果要执行该脚本,必须先使其可执行: chmod +x filename
然后再在该脚本所在的目录下,输入 ./filename即可
1.注释 以#开头的为注释,直到该行的末尾,推荐一定要写注释
2.变量赋值和引用
使用变量无需声明,所有变量名都是用字符串组成,变量名首个字符必须为字母,大小写均可,中间不能有空格
需要赋值时,直接 变量名=值,注意,由于shell默认处理的类型是字符串,所以呢,这个值无论是什么类型,对于shell来说都是字符串,要想赋其他类型的值,需要用declare关键字声明,还有,等号两边不能加空格。
需要取用变量值的时候,在变量前加一个美元 $ 符号。
一些注意事项:
1)比如说
num=2
echo "this is the " $numnd
输出结果肯定是this is the 就没了,为什么呢,因为系统会去找变量numnd,而不是num,既然numnd不存在,那么就找不到。
正确的做法应该是 echo "this is the " ${num}nd,但是大括号要注意位置,如果放到美元符号外面了,那么输出就会有大括号。总的来说就是大括号其实起一个保护作用,无论什么时候都可以用,将变量放在里面,都没有错
使用变量无需声明,所有变量名都是用字符串组成,变量名首个字符必须为字母,大小写均可,中间不能有空格
需要赋值时,直接 变量名=值,注意,由于shell默认处理的类型是字符串,所以呢,这个值无论是什么类型,对于shell来说都是字符串,要想赋其他类型的值,需要用declare关键字声明,还有,等号两边不能加空格。
需要取用变量值的时候,在变量前加一个美元 $ 符号。
一些注意事项:
1)比如说
num=2
echo "this is the " $numnd
输出结果肯定是this is the 就没了,为什么呢,因为系统会去找变量numnd,而不是num,既然numnd不存在,那么就找不到。
正确的做法应该是 echo "this is the " ${num}nd,但是大括号要注意位置,如果放到美元符号外面了,那么输出就会有大括号。总的来说就是大括号其实起一个保护作用,无论什么时候都可以用,将变量放在里面,都没有错
2)双引号里面如果还有变量,那么变量值可以得到保证;但引号里面所有的东西都只是字符而已。
举例:
name="joshua"
name1="my name is $name"
name2='my name is $name'
echo $name1 //输出的结果是 my name is joshua
echo $name2 //输出的结果是 my name is $name
3)除了一般的仅在程序内有效的shell变量以外,还有环境变量。由export关键字处理过的变量叫做环境变量。暂时不讨论
举例:
name="joshua"
name1="my name is $name"
name2='my name is $name'
echo $name1 //输出的结果是 my name is joshua
echo $name2 //输出的结果是 my name is $name
3)除了一般的仅在程序内有效的shell变量以外,还有环境变量。由export关键字处理过的变量叫做环境变量。暂时不讨论
3.Shell命令和流程控制
1) 常用命令,22个,必须用熟
2) 概念:管道,重定向和backtick(反短斜线)
这些不是系统命令,但是都是很重要的表达符号
a.管道( | ),没错,就是那一根竖线,它要表达的意思就是将一个命令的输出作为另一个命令的输入
b.重定向:将命令的结果输出到文件,而不是屏幕
> 表示写入文件并覆盖旧文件
>> 加到文件的尾部,保留旧文件内容
c.反短斜线:将一个命令的输出最为另一个命令的命令行参数
############这个部分暂时不用太深究
3) 流程控制
a.if 表达式
if [ 条件判断一 ] && (||) [ 条件判断二 ]; then
执行内容程序
elseif [ 条件判断三 ] && (||) [ 条件判断四 ]; then
执行第二段内容程序
else
执行第三段内容程序
fi
举个例子(这个例子可能太简单,具体的其他例子再好好探究)
if [ $buffer = 5M ]
if [ "$a" = "$b" ]
if [ ${SHELL}="/bin/bash" ] 变量$SHELL包含有登录shell的名称,我们拿它和/bin/bash进行比较以判断当前使用的shell是否为bash。
if [ ${SHELL}="/bin/bash" ] 变量$SHELL包含有登录shell的名称,我们拿它和/bin/bash进行比较以判断当前使用的shell是否为bash。
注意,方括号表示测试条件,方括号紧接着的是空格,千万不可落掉。而且,每一个独立的组件之间,都需要有空格来隔开。
b.快捷操作符
b.快捷操作符
&&,和c语言不一样,这个表示,如果前面的判断式为“真”,那么旧执行后面的语句。
||,同样在shell编程中也是可用的
我们如果不用与或操作符也是没有问题的,用if语句就行,但是使用与或操作符会更加简便
c. case表达式
case 种类方式(string) in //其实常常,这个种类方式就是$1,然后用户需要从输入设备输入一个参数
//当然,本身它可以是一个已定义的变量,甚至是read的参数
//当然,本身它可以是一个已定义的变量,甚至是read的参数
种类方式一 )
程序执行段
;; //2个分号
;; //2个分号
种类方式二 )
程序执行段
;;
*)
echo "Usage: {种类方式一|种类方式二}" //列出可以利用的参数值,这个主要是为了方便用户输入
exit 1
esac //判断结束
程序执行段
;;
*)
echo "Usage: {种类方式一|种类方式二}" //列出可以利用的参数值,这个主要是为了方便用户输入
exit 1
esac //判断结束
其实这个是通常在case后面传一个$1,也就是代表从屏幕输入的第一个参数,紧跟在./xxx.sh 后面就行,然后对它进行判断
d.loop循环
(1). while-loop循环
while ... ; do
...
done
当while的判断为真时,就执行loop里面的内容。break和continue的作用和java一样
(2). for-loop循环
查看一个字符串列表 (字符串用空格分隔),然后将其赋给一个变量
for var in ...; do
...
done
e. select表达式
对于交互式使用非常方便,用户可以从一组不同的值中进行选择
select var in ... ; do //假如说省略号的部分是“1” “2” “3”
//那么执行以后屏幕上就会显示一些选项1,2,3,请你输入
break
done
可以接着再写一句输出,以表明选到了哪一个
当执行以后,就会请你输入(可以在第一行先写一个输出,提示用户输入什么信息)
然后$var就可以当作一个参数来使用,比如打印出来看看
有时候会遇到有通配符,比如说某个目录下有2个jpg文件,hei.jpg和moi.jpg,
输出若为 echo *.jpg就会把2个的名字都打印出来。如果不想发生这种情况,就使用引号,确切的说是单引号。暂时不讨论那么多,记住就ok。
5.函数
拿帮助函数来举例子,我写一个help函数,然后当你输入一个东西的时候我就给你显示出来我定义好的帮助信息。
函数必须事先进行声明
functionname()
{
body
}
6.卷标与运算符号 : declare
因为bash默认的变量类型为字符串类型,所以如果比如你想进行数学运算,就不能直接进行,假如你写了3*5,输出来的还是3*5,不会是15。怎么办呢???声明。。。怎么声明???declare命令
declare [-afirx]
具体每一个是什么意思用的时候再查了,举个例子吧
declare -i a=3
declare -i number=2*3+5*13-32+25
7.关于一个输入参数的问题
有时候需要用户从输入设备上来输入一些参数,从而达到赋值的作用,举例:
echo "this script name is $0"
echo "some other parameters are $1 $2 $3"
那么在你运行的时候,就是 ./XXX.sh 的时候,后面要加上 name pa1 pa2 pa3
这样就会显示出来,相当于是交互式的
还有一种,不需要参数标号,就输入一次,那就是read,比如你写一句read name,那么就自动有一个叫name的参数,可以使用。(只是我现在不知道它到底是临时的还是永久的,存在哪里的,存多久???)
8.总结
1) 任何优秀的脚本都应该具有帮助和输入参数
2) 任何优秀的脚本都应该写一个伪脚本(framework.sh),该脚本包含了大多数脚本都需要的框架结构。这样我们在写一个新的脚本时,只需要执行copy命令,然后进行一些添加和修改