Shell脚本学习
shell脚本学习
shell就是命令解析器,将用户输入的指令转换为相应的机器能够运行的程序。
Shell是一个作为用户与linux系统间接口的程序,它允许用户向操作系统输入需要执行的命令,在linux中可有多种shell。
一:Shell的种类:
ash:是贝尔实验室开发的shell,bsh是对ash的符号链接。
bash:是GNU的Bourne Again shell,是GNU操作系统上默认的shell。sh以及bash2都是对它的符号链接。
tcsh:是Berkeley UNIX C shell。csh是对它的符号链接
二:shell命令
shell命令的基本格式是:
命令名 [选项] <参数1> <参数2> ……
shell提示符 :# $
GNU工具中的bash,作为/bin/sh被默认安装
大多数linux发行版中,shell程序/bin/sh实际上是对程序/bin/bash的一个链接
命令/bin/sh -version可用于查看bash的版本。
三:shell脚本
Shell脚本是一个包含一系列命令序列的文本文件。当运行这个脚本文件时,文件中包含的命令序列将得到执行。
Shell脚本的第一行必须是如下格式:
#!/bin/sh
符号#!用来指定该脚本文件的解析程序。在上面 例子中使用/bin/sh来解析该脚本。当编辑好脚本后,如果要执行该脚本,还必须使其具有可执行属性:chmod +x filename。
在进行shell编程时,以#开头的句子表示注释,直到这一行的结束。如果使用了注释,即使相当长的时间内没有使用该脚本,也能在很短的时间内明白该脚本的作用及工作原理。
Shell脚本的执行:sh hello.sh(假设有一个hello.sh的脚本)。
变量:在shell编程中,所有的变量都由字符串组成,并且不需要预先对变量进行声明,
#!/bin/sh
#set variable a
a=8
#print a
echo "a is:"
echo $a
注意思考:
例子1:
A=8
echo $ABC 输出啥?为什么?
A=8
echo ${A}BC 输出啥?为什么?
例子2:
A=8
echo “$A” 输出啥?为什么?
A=8
echo ‘$A’ 输出啥?为什么?
“$A”会被解析为变量,输出8,‘$A’输出$A;
默认变量:
$# :传入脚本的命令行参数个数
$* :所有命令行参数值,在各个参数值之间留有空格
$0 :命令本身(shell文件名)
$1 :第一个命令行参数
$2 :第二个命令行参数
局部变量:
在变量首次被赋值时加上 local 关键字
1.变量赋值时,“=”左右两边都不能有空格
2.BASH 中的语句结尾不需要分号
IF语句
if [expression ]
then
#code block
fi
if [expression ]
then
#code block
else
#code block
fi
if [ expression ]
then
#code block
elif [ expression ]
then
#code block
else
#code block
fi
if [ expression ]; then
#code block
elif [ expression]; then
#code block
else
#code block
fi
比较:
比较操作整数操作 字符串操作
相同-eq=
不同-ne !=
大于-gt>
小于-lt<
大于或等于 -ge
小于或等于 -le
为空-z
不为空-n
比较整数a和b是否相等:if [ $a = $b ] (也可用eq)
判断整数a是否大于整数b:if [ $a -gt $b ]
比较字符串a和b是否相等:if [ $a = $b ]
判断字符串a是否为空: if [ -z $a ]
判断整数变量a是否大于b:if [ $a -gt $b ]
1. 在“[”和“]”符号的左右都留有空格
2. “=”左右都有空格
-e文件已经存在
-f文件是普通文件
-s文件大小不为零
-d文件是一个目录
-r文件对当前用户可以读取
-w文件对当前用户可以写入
-x文件对当前用户可以执行
例S5:
#!/bin/sh
folder=/home
[ -r "$folder" ] && echo “can read $folder"
[ -f "$folder" ] || echo "this is not file"
FOR循环
for 循环结构与 C 语言中有所不同,在 BASH 中for循环的基本结构是:
for var in [list]
do
#code block
done
其 中 $var 是循环控制变量,[list] 是 var 需要遍历的一 个集合,do/done 对包含了循环体,相当于C语言中的一对大括号。另外如果do 和 for 被写在同一行,必须在 do 前面加上 “;”。如:
for $var in [list]; do...done
#!/bin/bash
for day in Sun Mon Tue Wed Thu Fri Sat
do
echo $day
done
如果列表被包含在一对双引号中,则被认为是一个元素,如:
#!/bin/bash
for day in "Sun Mon Tue Wed Thu Fri Sat "
do echo $day done
上面的例子中,在 for所在那行,变量 day 是没有加 "$"符号的,而在循环体内,echo 所在行变量$day是必须加上"$"符号的。
WHILE循环
while 循环的基本结构是:
while [ condition ]
do
#code block
Done
UNTILL循环
until 循环的基本结构是:
until [ condition ]
do
#code block
done
while 和 until的区别在于while是为真时执行,until是为假时执行
CASE语句
BASH 中的 case 结构与 C 语言中的 switch 语句的功能比较类似,可以用于进行多项分支控制。
case "$var" in
condition1 )
;;
condition2 )
;;
* )
default statments;;
esac
例子:
#!/bin/bash
echo "Hit a key, then hit return.“
read Keypress
case "$Keypress" in
[[:upper:]] )echo" Uppercase letter";;
[[:lower:]] )echo" Lowercase letter";;
[0-9] )echo"Digit";;
* ) echo "Punctuation, whitespace, or other";;
Esac
Bash shell的功能
1.命令记忆能力
2.使用Tab键进行命令与文件的补全功能
3.设置命令的别名(eg:alias lm=’ls -l’)
4.作业控制、前台、后台控制
5.程序脚本(shell script)
6.支持通配符
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。