系统相关
首页 > 系统相关> > shell脚本

shell脚本

作者:互联网

一、 shell脚本

1、 shell脚本,应该拥有以下基本元素

脚本以.sh为扩展名 方便查看

1、第1行的声明“#!/bin/bash”

2、注释:说明某些代码的功能
单行注释: #
多行注释: :<<BLOCK
BLOCK
(此处英文相照应就行)

3、可执行语句:实现程序的功能
(循环语句、判断、函数、数组、变量)

2、Shell脚本的执行

方法一:以相对路径的方式去执行shell脚本
方法二:以绝对路径的方式去执行shell脚本
方法三:直接使用bash来执行shell脚本
方法四:在当前的shell环境中执行bash shell脚本:source或.

#区别:
1、方法三:可以在脚本中不指定解释器,脚本可以没有执行权限
2、方法一和方法二脚本需要有执行权限,./script_name.sh 或/path/script_name.sh
3、方法四:当前shell执行,方法1-3开启子shell

3、 shell脚本编写规范

1)没有必要使用cat命令
使用以下方式即可
grep guru /etc/passwd

2)代码缩进

4、 位置化参数

这种变量主要是用来向脚本当中传递参数或数据的,变量名不能自定义,变量作用是固定的。

$1 $2 $3 $4 $5 $6 $7 $8 $9 ${10}
 预定义变量
是 Bash 中已经定义好的变量,变量名不能自定义,变量作用也是固定的。
$0 :脚本名
$* :所有的参数,双引号引起来时参数视为单个字符串
$@:所有的参数,双引号引起来时,每个参数作为个体
$# :参数的个数
$$ :当前进程的PID
$? :上一个命令的返回值0表示成功

5、read从命令行读入变量值

read从命令行读入变量值

read 变量名
read -p "提示信息: " 变量名
read -t 5 -p "提示信息: " 变量名
(等待时常5秒)

read命令行中也可以不指定变量 ,如果不指定变量,那么read命令会将接收到的数据放置在环境变
量REPLY中

6、exit退出码

程序执行后会携带一个退出码:
(1) 0代表成功,1-255代表失败
(2) Shell程序的退出码储存在系统变量$?中
(3) exit num可以中断程序并设置退出码为num

举例:
ping -c1 baidu.com >> /dev/null
echo $?
0

7、 条件执行运算符

命令是否执行要根据前面命令的退出码
&&代表逻辑与
||代表逻辑或

举例
[root@wfy ~]#  grep  no_such_user /etc/passwd || echo 'No such user'
No such user

8、复合指令


复合指令:即一串命令, ()和{}都是对一串的命令进行执行,但有所区别:

相同点:
()和{}都是把一串的命令放在括号里面,如果命令在一行命令之间用; 号隔开

不同点:
()只是对一串命令重新开一个子shell进行执行
{}对一串命令在当前 shell执行

()最后一个命令可以不用分号
{}最后一个命令要用分号

()里的第一个命令和左边括号不必有空格
{}的第一个命令和左括号之间必须要有一个空格

举例
[root@wfy ~]# (pwd;cd /tmp;pwd)
[root@wfy ~]#  { pwd;cd /tmp;pwd;}
# ()子shell中执行,执行完毕,当前路径不变9、文件测试表达式 

9、文件测试表达式

操作符 说明 举例
-b file 检测文件是否是块设备文件,如果是,则返回true。 [ -b $fiIe ]返回fase。
-c file 检测文件是否是字符设备文件,如果是,则返回true [ -c $file ]返回false.
-d file 检测文件是否是目录,如果是,则返回true。 [ -d $file ]返回false.
-f file 检测文件是否是目录,如果是,则返回true检测文件是否是普通文件(既不是目录,也不是设备文件),如果是,则返回true。 [ -f $file ]返回true。
-g file 检测文件是否设置了SG1D位,如果是,则返回true. [ -g $file ]返回false。
-k file 检测文件是否设置了粘着位(Sticky Bit),如果是,则返回true。 [ -k $file ]返回false。
-p file 检测文件是否是具名管道,如果是,则返回true. [ -p $file ]返回false。
-u 检测文件是否设置了SUID位,如果是,则返 [ -u $file ]返回false
-r file 检测文件是否可读,如果是,则返回true. [ -r $fiIe ]返回true。

10、 数值运算符

比较两个数值大小

运算符 说明 举例
-eq 检测两个数是否相等,相等返回true。 [ $a-eq $b ]返回true.
-ne 检测两个数是否相等,不相等返回true。 [ $a-ne $b ]返回true。
-gt 检测左边的数是否大于右边的,如果是,则返回true. [ $a-gt $b ]返回false。
-It 检测左边的数是否小于右边的,如果是,则返回true. [ $a-It $b ]返回true。
-ge 检测左边的数是否大等于右边的,如果是,则返回true。 [ $a-ge $b ]返回false.
-le 检测左边的数是否小于等于右边的,如果是,则返回true。 [ $a-le $b ]返回true。

11、 布尔运算符

运算符 说明 举例
! 非运算,表达式为true则返回false,否则返回true。 [ ! false ]返回true
-0 或运算,有一个表达式为true则返回true. [ $a -It 20 -o $b -gt 100 ]返回true。
-a 与运算,两个表达式都为true才返回true. [ $a -it 20 -a $b -gt100 ]返回false。

12、 字符串运算符

运算符 说明 举例
= 检测两个字符串是否相等,相等返回true. [ $a = $b ]返回false。
!= 检测两个字符串是否相等,不相等返回true。 [ $a != $b ]返回true.

13、 条件判断-if语句

#单分支结构
第一种语法:
if <条件表达式>
then
指令
fi

第二种语法:
if <条件表达式>;then
指令
fi

#双分支结构
if <条件表达式>;then
指令序列1
else
指令序列2
fi

#多分支结构
if 条件表达式1;then
命令序列1
elif 条件表达式2;then
命令序列2
else
命令序列n
fi

#示例
根据用户输入成绩,判断优良中差。
85-100 优秀--A 70-84 良好--B 60-69 合格--C 60分以下不合格--D
read -p "Please enter your score (0-100): " grade
if [ $grade -ge 85 ]; then
echo "$grade, A"
elif [ $grade -ge 70 ]; then
echo "$grade, B"
elif [ $grade -ge 60 ]; then
echo "$grade, C"
else
echo "$grade, D"
fi

14、 条件判断-case语句

case 变量名 in
值1)
	指令1
	;;
值2)
	指令2
	;;
值3)
	指令3
	;;
*)
	指令4
esac


#示例1
由用户从键盘输入一个字符,并判断该字符是否为字母、 数字或者其他字符, 并输出相应的提示信息。
read -p "Please enter a character, press enter to continue: " KEY
case "$KEY" in
[a-z]|[A-Z])
	echo "Input is letter"
	;;
[0-9])
	echo "Input is number"
	;;
*)
	echo "Input is other characters"
esac


#示例2:将判断分数范围用case语句实现
read -p "Please enter your score (0-100): " grade
case "$grade" in
8[5-9]|9[0-9]|100)
	echo "$grade, A"
	;;
7[0-9]|8[0-4])
	echo "$grade, B"
	;;
6[0-9])
	echo "$grade, C"
	;;
*)
	echo "$grade, D"
esac 

15、 循环语句-for循环

#方法1:直接列出元素方法
for i in 1 2 3 4 5
do
echo $i
done

#方法2:使用大括号
for i in {1..5}
do echo $i
done

#方法3:使用seq
for i in $(seq 1 5)
do
echo $i
done

#方法4:使用命令的结果
for i in $(ls *.sh)
do
echo $i
done 

标签:脚本,返回,shell,grade,echo,file,true
来源: https://www.cnblogs.com/wengfy/p/16271749.html