合肥本地建网站,请人做竞价网站的要求重点,app 网站运营ppt,钢结构Shell 1、Shell脚本2、常用运算符2、特殊语法4、关于变量的一些命令4.1、echo4.2、export4.3、read4.4、declare/typeset4.5、local4.6、unset 5、基本逻辑语法5.1、if判断5.2、for循环5.3、while循环5.4、case语句 6、函数定义7、多脚本链接 1、Shell脚本
学习shell脚本开发之… Shell 1、Shell脚本2、常用运算符2、特殊语法4、关于变量的一些命令4.1、echo4.2、export4.3、read4.4、declare/typeset4.5、local4.6、unset 5、基本逻辑语法5.1、if判断5.2、for循环5.3、while循环5.4、case语句 6、函数定义7、多脚本链接 1、Shell脚本
学习shell脚本开发之前必须得有一些基础的Linux相关知识比如环境变量和shell指令的等内容。 了解Linux的系统环境变量和shell命令可以看看我之前发过的两篇文章。 Shell命令Linux操作命令笔记 Linux学习笔记之二环境变量
再说回shell脚本和shell命令简单来说我们在Linux终端中敲下的大多数指令都是shell指令比如cd , ls, pwd之类的。而 shell脚本就是在一个文件中把这些shell指令依次写在一起然后让其自动依次执行。这样我们就不需要在终端一条条的去执行了。来看个例子吧。 例程目的我想切换到$HOME/target目录并且列出target目录下的所有文件。 首先我先新建一个test.sh的文件然后往里面写入对应的shell指令。shell脚本文件的第一句话必须是
#! /bin/bash写这句话相当于在告诉Linux系统我写的这个文件是shell脚本请用bash解释器来解释这个脚本。 最后执行这个脚本就可以看到我target文件夹下的所有文件了。 常用的shell指令不妨移步
2、常用运算符
等于号
-eq
note: equal不等号
-ne
note: not equal大于号
-gt
note: greater than大于或等于号
-ge
note: greater than or equal to小于号
-lt
note: less than小于等于号
-le
note: less than or equal to逻辑与
-a
eg: [ $a -eq $b -a $a -eq $c ] #a等于b于a等于c逻辑或
-o
eg: [ $a -eq $b -o $a -eq $c ] #a等于b或a等于c比较运算符号大概就这些note后面是缩写符号的整体意思希望能够帮助记忆。但一点需要值得注意以上这些特殊字符之用于判断整数与整数之间的关系而不能用于判断字符串。如果想要判断字符串还得用 ! ! !号这些同时这些常规符号也兼容整数判断。至于逻辑运算符则也可以用, ||代替上述的-a和-o。 下面举几个例子来看一下-eq和 的区别。
namelihua
age18
[ $name -eq lihua ]; ❌
[ $name lihua ]; ✔
[ $age 18 ]; ✔此外在用$符号对变量取值的时候最后还是加上一对双引号这样可以避免很多错误。比如下面这个例子
nameli hua
[ $name li hua ] ❌
[ $name li hua ] ✔如果不加双引号那$name等于li hua第一条语句就变成了下面这个样子显然会报错。
li hua li hua加了引号就变成。
li hua li hua并且加引号只是把这个变量视为一个整体。但是凡被括号括起来的数据都会被转化为数据串类型。。。 那么再提一句如果想把字符串转化为整形可以利用双括号的作用。
var05
num$((var))
echo $num2、特殊语法
-r判断给定文件是否是可读文件。-w判断给定文件是否是可写文件。-x判断给定文件是否是可执行文件。-d判断给定参数是否是一个文件夹。-f判断给定参数是否是一个文件。-s判断一个文件是否存在并且是否非空。-z判断给定的字符串是否为空字符串。-n判断给定的字符串是否为非空字符串。
以上这些都是一些常见的单选项标记符。判断为真则返回1否则返回。常用于if语句中比如我们想判断home目录下的object_file是不是可执行文件可以做如下操作。
if [ -x $HOME/object_file ];thenecho it is a execuate file
fi除了以上这些特殊标记符还有许多特殊状态变量如下
$0获取文件名$n获取输入的第n个参数$?获取上一条命令执行的结果任何bash语句执行结果只有两种执行成功为0否则非0。$#获取传递的参数的总个数。$*获取脚本所有参数加引号则表示“$1 $2 … $n ”。$获取脚本所有参数加引号则表示 $1 “,” $2 “,” $n 。 常用于for循环读取参数。$!获取上一个进程的pid号。$$获取当前shell脚本的pid号。$_获取上一次命令的最后一个参数。
看来$ 这个符号在Linux中还挺重要的个人感觉它有点”取值“的意味我们取一个变量也会用到$, 比如 $variable 。 最后我写一个脚本把这些特殊状态变量都用上来看看以上这些特殊变量到底怎么用的。 执行一下看看效果
4、关于变量的一些命令
下面介绍一些出现频率比较高的命令但我仅讲一些常见的应用不求全面详细。
4.1、echo
echo常用于打印变量。可以选择是否添加e和n参数前者使echo可以识别转移字符后者让echo打印之后不换行echo默认打印后换行。 举几个例子
echo hello
echo -e hello\n #可以识别\n
echo -n hello #打印后不换行
echo -en hello\t #识别转义字符且不换行
echo -ne hello\t #效果同上从上面例子可以看出echo的参数可以自由组合且不必考虑顺序实现效果叠加。其他命令也同样可以。
4.2、export
export可以将变量转化成环境变量所以我们经常在配置环境变量的时候用到这个命令。
export PATH$PATH:$HOME/4.3、read
在shell脚本中使用read命令正如在C语言中使用scanf命令或在python中使用input一样可以获取用户的输入字符串。它可选的两个参数有p和t两个参数前者可以显示提示符后者可以设置等待用户输入的时间。 上个例子这里我编写一个read.sh的脚本。
#! /bin/bashread -p please enter a number: num_1read -p please enter another number: -t 5 num_2echo -e \nthe first number is $num_1if [ -n $num_2 ];thenecho the second number is $num_2
elseecho there is no the second number
fi接着我故意第二个参数不输入我们来看看结果。
4.4、declare/typeset
declare和typeset的功能基本一样所以这里只说declare。 由于shell和python一样都是弱定义型语言即变量的类型取决于它所接受到值的类型无需提前规定好。但弱定义偶尔也有一些不好地方比如我们本来希望它是一个整型变量它却因各种原因变成字符串类型。比如read会把数字也视为字符串。。 而declare的主要作用就是声明变量类型让变量的类型不至于”跑偏“。它常用的参数有以下这些
-a将变量定义成数组类型。-i将变量定义成整数类型。-x将变量定义成环境变量。-r将变量定义为只读变量同时该变量无法被unset。
看个例子
declare -i num
read -p please enter a number: num这样就可以保证num这个变量就是一个整型了。 再来看看数组怎么用
#! /bin/bashdeclare -a num
read -p please enter a number: num[0]
read -p please enter another number: -t 5 num[1]
echo -e \nthe first number is ${num[0]}
if [ -n $num[1] ];thenecho the second number is ${num[1]}
elseecho there is no the second number
fi其实还是用[ ]来索引数组里面的值但由于$的优先级高于[ ]所以记得用{ }来使num先索引再取值。除了用declare定义我们也可以用弱定义的方式定义一个固定长度的数组。
num[0]1
num[1]2
..4.5、local
声明一个变量是一个局部变量由于shell语言中不同于大多数程序语言在其函数内部声明的变量不会被自动视为局部变量。所以有时候为了使函数中的变量是局部变量就会用到local命令。 比如下面这个例子在test这个函数内声明了一个var的局部变量如果在函数外打印它就会报错。
#! /bin/bashfunction test{local var1
}echo $var4.6、unset
unset就比较简单了其功能是删除一个变量。如下删除var变量之后再调用echo是会报错的。
#! /bin/bashvartest
unset var
echo $var看到unset便自然的想到是否有set其实是有的只不过它们的功能大相径庭set主要用于显示所有环境变量。所以与unset相反的作用的更像是typeset。
5、基本逻辑语法
5.1、if判断
基本用法如下注意该空格的地方不能省略不该空格的地方不能多加。
#! /bin/bashage18
if [ $age -gt 18 ];thenecho adult
elseecho child
fi在shell脚本中的中括号的主要用于条件测试我们在看看if和逻辑预算符号一起使用的例子。
#! /bin/bashage21
if [ $age -eq 18 ] [ $age -lt 20 ];
thenecho yes
elseecho no
fi5.2、for循环
#! /bin/bashfor i in {1..4};
doecho $i
doneshell中的大括号用处挺多的但这里的大括号表示生成一系列可能的集合即1234。另外在也可借助双引号的能力来像C语言那样实现从1到4的遍历。
for((i1; i4; i));
doecho $i
done5.3、while循环
#! /bin/bashcounter0
while [ $counter -le 5 ]
doecho Counter: $counter((counter))
donecounter外面必须包裹两个小括号因为双括号用于逻辑运算和数学操作。
5.4、case语句
fruitapplecase $fruit inapple)echo You chose an apple.;;banana)echo You chose a banana.;;orange|grape)echo You chose an orange or a grape.;;*)echo You chose something else.;;
esac其中“ * ) ”表示默认。在这里指如果fruit不是apple, banana, orange, grape其中一个就执行 “ * ) ”之后的操作。
6、函数定义
shell中的函数定义就比较奇怪了主要体现在参数传输这一块。我们可以直接看看代码。
#! /bin/bashfunction name()
{name$1age$2echo his name is $nameecho his age is $age
}name xaioming 18可以看到上述例程所定义的函数之前有一个function的关键字但其实这个是可有可无的。其次可以用$1之类的符号来获得传入的参数。另外即便调用该函数的时候传入了两个参数但只拿除一个来用也无所谓。
#! /bin/bashname()
{name$1#age$2echo his name is $name#echo his age is $age
}name xaioming 18还有几点需要注意的其一就是shell脚本和python一样调用该函数必须在该函数定义之后。其二在函数里面定义的变量如何不用local声明那么是会被认为是全局变量的这样可能会照成很多麻烦。
7、多脚本链接
前面提到shell脚本的编写逻辑和python有点像调用函数之前必须在先定义函数。那么当定义的函数多了就势必导致代码变成非常混乱和难读这时候就需要学会多脚本链接了。 在一个名为script_1.sh的脚本写一个函数
#! /bin/bashfunction hello()
{name$1echo hello, i am $name
}在一个名为script_2.sh的脚本调用hello函数并且传入名字
# /bin/bashsource ./script_1.shhello li hua当你在script_2.sh中执行source script_1.sh这句代码的时候它会引入script_1.sh的文件的代码并执行它。