Shell便是一种命令语言,又是一种程序设计语言,使用者能够经过Shell访问操做系统的内核服务。java
Shell编程和java、python、C同样,只要一个能编写代码的文本编辑器和一个能解释执行的脚本解释器就能够了,Linux的Shell种类众多,咱们只关注与Bash(Bourne Again Shell (/bin/bath))python
#! /bin/sh和#! /bin/bash没多大区别,#!告诉系统须要什么解释器来执行该Shell脚本程序。linux
shell的打印输出函数 echo。shell
从键盘获取输入信息---- read 编程
read name //从键盘数据保存在name变量中 echo "从键盘获取的信息是 $name"
一、read命令提供了-p参数,-p后面的字符串会显示出来数组
read -p "输入第一个数字:" a #获取键盘输入的 a 变量数字 read -p "输入第二个数字:" b #获取键盘输入的 b 变量数字 r=$[a+b] #计算a+b的结果 赋值给r 不能有空格 echo "sum = ${r}" #输出显示结果 r
输出结果bash
输入第一个数字:1 输入第二个数字:2 sum = 3
二、计时输入编程语言
使用read命令存在着潜在危险。脚本会阻塞下来等待用户的输入。若是不管是否输入数据脚本都必须继续执行,可使用-t选项指定一个计时器。编辑器
if read -t 5 -p "please enter your name:" name then echo "hello $name ,welcome to my script" else echo "sorry,too slow" fi
三、设置read命令计数输入的字符。当输入的字符数目达到预约数目时,自动退出,并将输入的数据赋值给变量。
read -n1 -p "Do you want to continue [Y/N]?" answer case $answer in Y | y) echo "fine ,continue";; N | n) echo "ok,good bye";; *) echo "error choice";; esac
使用了-n选项,后接数值1,指示read命令只要接受到一个字符就退出
四、读文件
还可使用read命令读取Linux系统上的文件。每次调用read命令都会读取文件中的"一行"文本。当文件没有可读的行时,read命令将以非零状态退出。读取文件的关键是将文本中的数据传送给read命令,最经常使用的方法是对文件使用cat命令并经过管道将结果直接传送给包含read命令的while命令
count=1 //赋值语句,不加空格 cat test | while read line //cat 命令的输出做为read命令的输入,read读到的值放在line中 do echo "Line $count:$line" count=$[ $count + 1 ] //注意中括号中的空格。 done echo "finish" exit 0
Shell单行注释 # 注释内容
多行注释
:<<EOF
注释内容...
注释内容...
EOF
EOF也可使用其余字符,只要先后保持一致就行。
运行 Shell 脚本有两种方法:
一、做为可执行程序
将上面的代码保存为 test.sh,并 cd 到相应目录:
chmod +x ./test.sh #使脚本具备执行权限 ./test.sh #在当前目录执行脚本test.sh
二、做为解释器参数
这种运行方式是,直接运行解释器,其参数就是 shell 脚本的文件名,如:
/bin/sh test.sh
三、在Git Bash命令行中运行.sh文件
$ sh test.sh
Shell变量
定义变量时,变量名不加美圆符号"$",如:
you_name="LXP-Never"
变量名和等号之间不能有空格, 这和咱们熟悉的python编程语言不同,可是变量名的命名规则是同样的。
使用变量
使用一个定义过的变量,只需在变量名前面加美圆符号$ 便可
name="LXP" echo $name echo ${name}
变量名外面的花括号是可选的,加不加都行,若是加了花括号更加方便的识别变量的边界。推荐给全部的变脸加上花括号,这是一个好的编程习惯。
只读变量 readonly name,只读变量的值不能被改变,不能被unset删除
删除变量 unset name
Shell字符串,字符串能够用单引号,也能够用双引号,也能够不用。可是使用双引号能够用$符号使用变量,还可使用转义字符\
your_name="runoob" # 使用双引号拼接 greeting="hello, "$your_name" !" greeting_1="hello, ${your_name} !" echo $greeting $greeting_1 # hello, runoob ! hello, runoob ! # 使用单引号拼接 greeting_2='hello, '$your_name' !' greeting_3='hello, ${your_name} !' echo $greeting_2 $greeting_3 # hello, runoob ! hello, ${your_name} !
获取字符串长度
string="abcd" echo ${#string} # 4 expr length "$string" # 4
提取子字符串
如下实例从字符串第2个字符开始截取4个字符,取不到开始索引。
var="http://www.aaa.com/123.htm" echo ${string:1:4} # ttp:
从左边第几个字符开始,一直到结束,取不到开始索引。
echo ${var:7} # is a great site
从右边第几个字符开始,的几个字符
echo ${var:0-7:3} # 123
从右边第几个字符开始,一直到结束。
echo ${var:0-7} # 123.htm
Shell数组
从0开始索引
定义数组,用空格分割不一样的数组元素
array_name=(value1 value2 value3 ...valuen)
读取数组
读取数组元素值得通常格式是:
${数组名[下标]}
valuen=${array_name[n]}
使用 @ 符号能够获取数组中的全部元素
echo ${array_name[@]}
获取数组的长度
# 取得数组元素的个数 length=${#array_name[@]} # 或者 length=${#array_name[*]} # 取得数组单个元素的长度 lengthn=${#array_name[n]}
截取
#和##号截取,删除左边的字符 ${var#*//} # 删除var左边的字符,直到遇到第一个//
%和%%号截取,删除右边的字符 ${var%//*} # 删除var左边的字符,直到遇到第一个//
var=http://www.aaa.com/123.htm echo ${var#*//} # www.aaa.com/123.htm echo ${var##*/} # 123.htm echo ${var%/*} # http://www.aaa.com echo ${var%%/*} # http:
关系运算符
关系运算符只支持数字,不支持字符串
a=10 b=20
运算符 | 说明 | 举例 |
---|---|---|
-eq |
检测两个数是否相等,相等返回 true。 |
[ a−eqa−eq b ] 返回 false。 |
-ne |
检测两个数是否不相等,不相等返回 true。 |
[ a−nea−ne b ] 返回 true。 |
-gt |
检测左边的数是否大于右边的,若是是,则返回 true。 |
[ a−gta−gt b ] 返回 false。 |
-lt |
检测左边的数是否小于右边的,若是是,则返回 true。 |
[ a−lta−lt b ] 返回 true。 |
-ge |
检测左边的数是否大于等于右边的,若是是,则返回 true。 |
[ a−gea−ge b ] 返回 false。 |
-le |
检测左边的数是否小于等于右边的,若是是,则返回 true。 |
[ a−lea−le b ] 返回 true。 |
文件测试运算符
文件测试运算符用于检测 Unix 文件的各类属性。
操做符 | 说明 | 举例 |
---|---|---|
-d file | 检测文件是不是目录(在linux中目录就是文件夹的意思),若是是,则返回 true。 | [ -d $file ] 返回 false。 |
-e file | 检测文件(包括目录)是否存在,若是是,则返回 true。 | [ -e $file ] 返回 true。 |
-f file | 检测文件是不是普通文件(既不是目录,也不是设备文件),若是是,则返回 true。 | [ -f $file ] 返回 true。 |
-c file | 检测文件是不是字符设备文件,若是是,则返回 true。 | [ -c $file ] 返回 false。 |
-g file | 检测文件是否设置了 SGID 位,若是是,则返回 true。 | [ -g $file ] 返回 false。 |
-k file | 检测文件是否设置了粘着位(Sticky Bit),若是是,则返回 true。 | [ -k $file ] 返回 false。 |
-p file | 检测文件是不是有名管道,若是是,则返回 true。 | [ -p $file ] 返回 false。 |
-u file | 检测文件是否设置了 SUID 位,若是是,则返回 true。 | [ -u $file ] 返回 false。 |
-r file | 检测文件是否可读,若是是,则返回 true。 | [ -r $file ] 返回 true。 |
-w file | 检测文件是否可写,若是是,则返回 true。 | [ -w $file ] 返回 true。 |
-x file | 检测文件是否可执行,若是是,则返回 true。 | [ -x $file ] 返回 true。 |
-s file | 检测文件是否为空(文件大小是否大于0),不为空返回 true。 | [ -s $file ] 返回 true。 |
-b file | 检测文件是不是块设备文件,若是是,则返回 true。 | [ -b $file ] 返回 false。 |
布尔运算符
运算符 | 说明 | 举例 |
---|---|---|
! |
非运算 |
[ ! false ] 返回 true。 |
-o |
或运算 |
[ a−lt20−oa−lt20−o b -gt 100 ] 返回 true。 |
-a |
与运算 |
[ a−lt20−aa−lt20−a b -gt 100 ] 返回 false。 |
逻辑运算符
运算符 | 说明 | 举例 |
---|---|---|
&& |
逻辑的 AND |
[[ a -lt 100 &&a -lt 100 && b -gt 100 ]] 返回 false |
|| |
逻辑的 OR |
[[ a−lt100||a−lt100|| b -gt 100 ]] 返回 true |
字符串运算符
运算符 | 说明 | 举例 |
---|---|---|
= |
检测两个字符串是否相等,相等返回 true。 |
[ a=a= b ] 返回 false。 |
!= |
检测两个字符串是否相等,不相等返回 true。 |
[ a!=a!= b ] 返回 true。 |
-z |
检测字符串长度是否为0,为0返回 true。 |
[ -z $a ] 返回 false。 |
-n |
检测字符串长度是否为0,不为0返回 true。 |
[ -n "$a" ] 返回 true。 |
str |
检测字符串是否为空,不为空返回 true。 |
[ $a ] 返回 true。 |
Shell流程控制
if else
if condition1
then
command1
elif condition2
then
command2
else
command3
fi
for循环
for var in item1 item2 ... itemN
do
command1
done
while语句
while condition
do
command
done
case
Shell case语句为多选择语句,能够用case语句匹配一个值与一个模式,若是匹配成功,执行相匹配的命令。
case num in
1) command1
;;
2) command2
;;
esac
跳出循环
break、continue
Shell函数
funname(){
echo "这是个人第一个Shell函数"
}
echo "调用函数"
funname
可使用return返回函数
函数参数
在函数内部经过使用 $n 的形式来获取参数的值,例如,1表示第一个参数,1表示第一个参数, 2表示第二个参数...
funWithParam(){ echo "第一个参数为 $1 !" echo "第十个参数为 ${10} !" echo "参数总数有 $# 个!" echo "做为一个字符串输出全部参数 $* !" } funWithParam 1 2 3 4 5 6 7 8 9 34 73
输出结果:
第一个参数为 1 ! 第十个参数为 10 ! 参数总数有 11 个! 做为一个字符串输出全部参数 1 2 3 4 5 6 7 8 9 34 73 !
注意,10不能获取第十个参数,获取第十个参数需要10不能获取第十个参数,获取第十个参数须要 {10}。当n>=10时,须要使用${n}来获取参数。
$# 传递到脚本的参数个数
$* 以一个单字符串显示全部向脚本传递的参数
shell文件导入
. filename # 注意点号(.)和文件名中间有一空格
如:
test1.sh文件内
url="做者的名字是:"
在test2.sh脚本文件内导入test1.sh脚本
. ./test1.sh echo "${url}不告诉你"
添加可执行权限并执行,而后执行test2.sh脚本,
$ chmod +x test2.sh $ ./test2.sh 做者的名字是:不告诉你
参考文献
从键盘获取输入read
做者:凌逆战
欢迎任何形式的转载,但请务必注明出处。
限于本人水平,若是文章和代码有表述不当之处,还请不吝赐教。
本文章不作任何商业用途,仅做为自学所用,文章后面会有参考连接,我可能会复制原做者的话,若是介意,我会修改或者删除。