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