ICode9

精准搜索请尝试: 精确搜索
首页 > 系统相关> 文章详细

shell脚本

2022-05-14 22:34:58  阅读:185  来源: 互联网

标签:脚本 返回 shell grade echo file true


一、 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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有