概念
Shell脚本是包含一系列命令的文本文件,Shell读取此文件并执行命令
应用场景:
重复性操作;
批量事务处理;
自动化运维;
定时任务执行。
Shell脚本编写
我们可以直接在Linux界面进行操作,首先新建一个文件。
Shell脚本是以#!/bin/bash开头的。#! 是一个约定的标记,它告诉系统这个脚本需要什么解释器来执行,即使用哪一种 Shell
用echo命令向窗口输出文本
保存并退出。然后我们需要对该文件赋权,给其增加一个执行的权限
然后就可以调用我们需要的结果。
调用方式:
最常用的:./脚本路径
路径调用:如果在当前目录,则使用./test/sh,绝对路径也可以
普通脚本执行:sh脚本路径
指定b shell执行:/bin/bash 脚本路径
1、变量
注意,变量名和等号之间不能有空格,这可能和你熟悉的所有编程语言都不一样。同时,变量名的命名须遵循如下规则:
命名只能使用英文字母,数字和下划线,首个字符不能以数字开头。
中间不能有空格,可以使用下划线(_)。
不能使用标点符号。
不能使用bash里的关键字(可用help命令查看保留关键字)。
#!/bin/bash
a=1
echo $a
~
打印变量时,要再变量前加上$符,变量之间也可以引用:
#!/bin/bash
a=1
b=$a
c=${b}
echo $b
echo $c
除了可以赋值常量或者一个字符串外,我们也可以赋值查询语句
#!/bin/bash
result=`cat /test/java/exercise/firstShell.sh`
echo $result
可以直接调用出这一查询结果的值:
有时为了防止不小心改写了变量的赋值,我们可以设为该变量为只读:
#!/bin/bash
a='abc'
readonly a
a='def'
echo $a
即使我们重新给a赋值,a也不会改变
运算:
Shell的运算需要在两个小括号,或者一个中括号中进行:
#!/bin/bash
a=1
b=2
c=$(($a+$b))
d=$[$a*$b]
echo $c
echo $d
Shell字符串:
Shell字符串有单引号和双引号两种,这两个情况不同:
单引号字符串的限制:
单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的;
单引号字串中不能出现单独一个的单引号(对单引号使用转义符后也不行),但可成对出现,作为字符串拼接使用。
双引号字符串
双引号里可以有变量
双引号里可以出现转义字符
#!/bin/bash
name='sam'
gender="man"
str="Hello,$name"
sex='The person is a $gender'
echo $str
echo $sex
可以看到,双引号中可以引用单引号所定义的变量,反之则不行
2、传递参数
我们在执行Shell脚本时,也可以向脚本传递参数
#!/bin/bash
echo "当前执行的文件:$0"
echo "传递的第一个参数:$1"
echo "传递的第二个参数:$2"
echo "传递到脚本的参数个数:$#"
echo "以一个单字符串向脚本传递的参数:$*"
~
1,2和hello都是我们传递的参数,可以传输到Shell脚本中:
3、逻辑运算符
数值型
大于:-gt
小于:-lt
等于:-eq或==
不等于:-ne
小于等于:-le
字符串型:
等于:=或==
不等于:!=
是否为空:-z 字符串
下面我们结合上述的传递参数来运用一下逻辑运算符。
#!/bin/bash
a=$1
if [ $a -lt 10 ]
then
echo "a小于10"
elif [ $a -gt 10 ]
then
echo "a大于10"
else
echo "a等于10"
fi
Shell中的if语句和java中的较类似,最后以fi结尾。
通过传参,我们可以完称比较。当然,也可以直接在代码中进行比较,然后再控制台命令调出也可
字符串进行比较:
#!/bin/bash
a='abc'
b='abc'
if test $a == $b
then
echo 'true'
else
echo 'false'
fi
这里我们用test代替中括号,结果为true,说明二者相等
4、数组
Shell脚本的数据是用小括号定义的,数组的坐标从0开始。各元素之间用空格隔开,而不用逗号隔开,这一点要注意。
#!/bin/bash
arr=(1 2 3 4 5)
echo ${arr[0]}
echo ${arr[3]}
echo ${arr[@]}
~
我们定义一个数组arr,检索它下标为0和3的元素,用@可以遍历它所有的元素:
获取数组长度:
#!/bin/bash
arr=(1 2 3 4 5)
echo ${#arr[@]}
echo ${#arr[*]}
~
5、循环
while循环:
while循环后面跟判断条件,do~done之间进行运算
#!/bin/bash
a=1
while test $a -le 10
do
echo $a
let a++
done
~
完成1~10的遍历,-le表示小于等于
for循环
for循环的一般格式:
for var in item1 item2 ... itemN
do
command1
command2
...
commandN
done
如果要写成一行,各语句减用“;”隔开
for var in item1 item2 ... itemN; do command1; command2… done;
例如:
循环遍历1~5
#!/bin/bash
for a in 1 2 3 4 5
do
echo $a
done
我们还可以用下面的方式遍历,和java中for循环的遍历类似:
#!/bin/bash
for (( b=2;$b<=10;b++ ))
do
echo $b
done
case循环
case循环类似于java中的switch循环类似,可以用case语句匹配一个值与一个模式,如果匹配成功,执行相匹配的命令,基本格式:
已esac结尾
case 值 in
模式1)
command1
command2
...
commandN
;;
模式2)
command1
command2
...
commandN
;;
esac
例如
#!/bin/bash
num=$1
case $num in
1)
echo '您选择了 1'
;;
2)
echo '您选择了 2'
;;
3)
echo '您选择了 3'
;;
*)
echo '您选择了大于3的数'
;;
esac
这里我们从控制台输入数字选择:
TMOUT
在用户输入空闲一段时间后自动断开
#!/bin/bash
TMOUT=3
echo "What's your name?"
echo "You only have $TMOUT seconds to answer!"
read name
if test $? -eq 0
then
echo "Your name is $name"
else
echo "Time out"
fi
TMOUT是从read语句开始计时的
可以看出,三秒内输入可以正常输出,否则超时自退出
拓展链接
如果想深入了解Shell脚本命令的,可以点此链接:
Shell脚本