目录
shell script简介
Shell Script ,Shell脚本与Windows/Dos下的批处理相似,也就是用各类命令预先放入到一个文件中,方便一次性执行的一个程序文件,主要是方便管理员进行设置或者管理用的。但是它比Windows下的批处理更强大,比用其他编程程序编辑的程序效率更高,它使用了Linux/Unix下的命令。
脚本开头格式:#!/bin/bash
注:除了开头第一行的井号外,其余所有井号开头的都是注释
echo $$是查看当前的shell的shell id
简单的shell script练习
简单范例:read参数
read命令表示从键盘读取变量的值,通常用在shell脚本中与用户进行交互的场合。当系统遇到read的时候程序就不会往下运行了,而是需要等待用户输入信息
例:
#!/bin/bash
#这是我的第一个脚本
read -p "请输入你的名字:" name
echo "你好,$name"
注:如果没有声明变量,系统则会使用默认的变量$REPLY
三种执行脚本的方法
./xx.sh
bash xx.sh
source xx.sh
注:./xx.sh 和 bash xx.sh 的执行方法都是打开一个子shell来运行的;而使用source则是在当前shell下运行的;
数值运算
声明整型变量:declare -i
注:在申明变量时如果不加i参数,申请的变量默认是字符型的;不能用于数值的运算
let
let 命令是 BASH 中用于计算的工具,用于执行一个或多个表达式,变量计算中不需要加上 $ 来表示变量。如果表达式中包含了空格或其他特殊字符,则必须引起来
例:let bb=1+8
例:(()) 也可以直接表示运算操作
返回值
当我们在系统中执行命令的时候,命令执行的结果只会返回正确或者错误的信息;在linux中这些命令执行的结果信息被存放在容器中;且容器中只能保存上一次命令执行的结果;正确的结果返回值是0,如果是错误的结果返回值就是一个不为0的数
查看上一次命令的返回值:echo $?
数字、字符比较
在Linux中,数字和字符的比较时所用到的符号是不一样的,如下表所示:
test比较
例:test $aa -eq $bb
[ ]比较
[ $aa -gt $bb ] []用来比较;返回值为假
[ ]除了可以用来 比较变量的大小,还可以用来判断文件的一些属性,例如:
[ -f /etc/passwd ] -f属性用来判断文件是否存在
[ -r /etc/passwd ] -r属性用来判断是否具有读权限
[ -w /etc/passwd ] -w属性用来判断是否具有写权限
[ -x /etc/passwd ] -x属性用来判断是否具有执行权限
[ -z /etc/passwd ] -z属性用来判断字符是否存在
多条语句判断
判断1 && 判断2 (同真为真)
例:[ $aa -gt $bb] && echo OK
注:当判断1为假时,后面的判断2就不执行了
判断1 || 判断2 (一个为真即为真)
例:[ $aa -gt $bb] || echo OK
注:当判断1为真的时候,后面的判断2就不执行了
条件判断式
if判断式
语法格式:
#!/bin/bash
if 判断语句; then
xx
elif 判断语句; then
yy
else zz
fi
例1:
#!/bin/bash
grep -q ^$1 /etc/passwd
if [ "$?" -eq 0 ]; then
echo "$1 exist"
else
echo "not exist $1"
fi
例2:
#!/bin/bash
read -p "Enter your ages:" age
if [ $age -le 0 ] || [ $age -gt 150 ]; then
echo "please enter a corect age!"
elif [ $age -gt 0 ] && [$age -lt 20 ]; then
echo "hello young people!"
elif [ $age -gt 20 ] && [ $age -le 50 ]; then
echo "hello adult!"
else echo "hello aged!"
fi
case语句
语法格式:
#!/bin/bash
case 变量 in
值1) xx
;;
值2) yy
;;
esac
例1:
#!/bin/bash
case $1 in
[Tt]o*)
echo tom
;;
bob | mary)
echo xxx
;;
*)
echo zzz
;;
esac
运行结果:
例2:
#!/bin/bash
#here 文档的写法
cat <<END
1) tom
2) bob
3) mary
END
read -p "please shoice a number:" nu
case $nu in
1)
echo tom
;;
2)
echo bob
;;
3)
echo mary
esac
运行结果:
select匹配选择
例:
#!/bin/bash
PS3="Please select the command you want to execute :"
select xx in 'ls -l' pwd date
do
$xx
done
运行结果:
function函数
在Linux中可以通过定义一些特定的方法,以便于在多次使用的时候直接调用;这些方法我们称之为函数
定义函数的格式:
#!/bin/bash
#函数的定义方法
function 方法名 (){
方法体
}
#注:关键字function也可以不写,直接使用方法名
例:
#!/bin/bash
function xx (){
date
}
xx
#xx表示调用这个函数
运行结果:
循环(loop)
while循环
#!/bin/bash
sum=0
while [ "$sum" -lt 10 ]
do
let sum+=1
echo $sum
done
#while的语法格式
while 条件
do
循环体
done
注:while循环是满足条件之后,再去执行循环体中的内容;直到不满足条件才会跳出循环
until循环
#!/bin/bash
xx=0
until [ "$xx" -gt 24 ]
do
case "$xx" in
[0-9] | 1[01])
echo "good morning!"
;;
12)
echo "time to reast!"
;;
1[3-7])
echo "good afternoon!"
;;
*)
echo "good evening!"
esac
let xx+=1
done
#until的语法格式
until 条件
do
循环体
done
注:until与while原理相反,until先执行循环体再做判断;
for循环
for循环的语法格式:
for xx in 值1 值2 值3
do
循环体
done
例:
[root@localhost opt]
[root@localhost opt] for i in *
> do
> cp $i ${i}.bak #为当前目录的所有文件加上bak后缀
> done
[root@localhost opt] ll
总用量 56
-rwxr-xr-x. 1 root root 109 12月 26 14:22 cc.sh
-rwxr-xr-x. 1 root root 109 12月 26 15:05 cc.sh.bak
-rwxr-xr-x. 1 root root 240 12月 26 14:57 dd.sh
-rwxr-xr-x. 1 root root 240 12月 26 15:05 dd.sh.bak
-rw-r--r--. 1 root root 81 12月 25 13:45 test
-rw-r--r--. 1 root root 81 12月 26 15:05 test.bak
-rw-r--r--. 1 root root 36 12月 25 14:04 xx
-rw-r--r--. 1 root root 36 12月 26 15:05 xx.bak
-rwxr-xr-x. 1 root root 290 12月 26 11:38 xx.sh
-rwxr-xr-x. 1 root root 290 12月 26 15:05 xx.sh.bak
-rwxr-xr-x. 1 root root 106 12月 26 14:03 yy.sh
-rwxr-xr-x. 1 root root 106 12月 26 15:05 yy.sh.bak
-rwxr-xr-x. 1 root root 162 12月 26 14:13 zz.sh
-rwxr-xr-x. 1 root root 162 12月 26 15:05 zz.sh.bak
for嵌套循环:
#!/bin/bash
for i in a b c
do
for j in 1 2 3
do
echo $i$j
done
done
运行结果:
注:在for循环中,还可以写成如下形式:for((i=1;i<=10;i++)); for i in {1..10} 均表示取值范围为1~10
原创文章,转载请注明出处