【Linux】【Shell】【Basic】条件测试和变量
bash脚本编程 脚本文件格式: 第一行,顶格:#!/bin/bash 注释信息:# 代码注释: 缩进,适度添加空白行; 语言:编程语法格式,库,算法和数据结构 编程思想: 问题空间 --> 解空间 变量: 局部变量 本地变量 环境变量 位置参数变量 特殊变量 数据类型:字符型、数值型 弱类型:字符型 算术运算: +, -, *, /, %, ** let VAR=expression VAR=$[expression] VAR=$((expression)) VAR=$(expr argu1 argu2 argu3) 注意:有些时候乘法符号需要转义; 增强型赋值: 变量做某种算术运算后回存至此变量中; let i=$i+# let i+=# +=,-=,*=, /=, %= 自增: VAR=$[$VAR+1] let VAR+=1 let VAR++ 自减: VAR=$[$VAR-1] let VAR-=1 let VAR-- 练习: 1、写一个脚本 计算/etc/passwd文件中的第10个用户和第20个用户的id号之和; id1=$(head -10 /etc/passwd | tail -1 | cut -d: -f3) id2=$(head -20 /etc/passwd | tail -1 | cut -d: -f3) 2、写一个脚本 计算/etc/rc.d/init.d/functions和/etc/inittab文件的空白行数之和; grep "^[[:space:]]*$" /etc/rc.d/init.d/functions | wc -l 条件测试: 判断某需求是否满足,需要由测试机制来实现; 如何编写测试表达式以实现所需的测试: (1) 执行命令,并利用命令状态返回值来判断; 0:成功 1-255:失败 (2) 测试表达式 test EXPRESSION [ EXPRESSION ] [[ EXPRESSION ]] 注意:EXPRESSION两端必须有空白字符,否则为语法错误; bash的测试类型: 数值测试 字符串测试 文件测试 数值测试:数值比较 -eq:是否等于; [ $num1 -eq $num2 ] -ne:是否不等于; -gt:是否大于; -ge:是否大于等于; -lt:是否小于; -le:是否小于等于; 字符串测试: ==:是否等于; >:是否大于; <:是否小于; !=:是否不等于; =~:左侧字符串是否能够被右侧的PATTERN所匹配; -z "STRING":判断指定的字串是否为空;空则为真,不空则假; -n "STRING":判断指定的字符串是否不空;不空则真,空则为假; 注意: (1) 字符串要加引用; (2) 要使用[[ ]]; 文件测试: 存在性测试 -a FILE -e FILE 文件的存在性测试,存在则为真,否则则为假; 存在性及类型测试 -b FILE:是否存在并且为 块设备 文件; -c FILE:是否存在并且为 字符设备 文件; -d FILE:是否存在并且为 目录文件; -f FILE:是否存在并且为 普通文件; -h FILE或 -L FILE:是否存在并且为 符号链接文件; -p FILE:是否存在且为 命名管道文件; -S FILE:是否存在且为 套接字文件; 文件权限测试: -r FILE:是否存在并且 对当前用户可读; -w FILE:是否存在并且 对当前用户可写; -x FILE:是否存在并且 对当前用户可执行; 特殊权限测试: -u FILE:是否存在并且 拥有suid权限; -g FILE:是否存在并且 拥有sgid权限; -k FILE:是否存在并且 拥有sticky权限; 文件是否有内容: -s FILE:是否有内容; 时间戳: -N FILE:文件自从上一次读操作后是否被修改过; 从属关系测试: -O FILE:当前用户是否为文件的属主; -G FILE:当前用户是否属于文件的属组; 双目测试: FILE1 -ef FILE2:FILE1与FILE2是否指向同一个文件系统的相同inode的硬链接; FILE1 -nt FILE2:FILE1是否新于FILE2; FILE1 -ot FILE2:FILE1是否旧于FILE2; 组合测试条件: 逻辑运算: 第一种方式: COMMAND1 && COMMAND2 COMMAND1 || COMMAND2 ! COMMAND [ -O FILE ] && [ -r FILE ] 第二种方式: EXPRESSION1 -a EXPRESSION2 EXPRESSION1 -o EXPRESSION2 ! EXPRESSION [ -O FILE -a -x FILE ] 练习:将当前主机名称保存至hostName变量中; 主机名如果为空,或者为localhost.localdomain,则将其设置为www.magedu.com; hostName=$(hostname) [ -z "$hostName" -o "$hostName" == "localhost.localdomain" -o "$hostName" == "localhost" ] && hostname www.magedu.com 脚本的状态返回值: 默认是脚本中执行的最后一条件命令的状态返回值; 自定义状态退出状态码: exit [n]:n为自己指定的状态码; 注意:shell进程遇到exit时,即会终止,因此,整个脚本执行即为结束; 向脚本传递参数: 位置参数变量 myscript.sh argu1 argu2 引用方式: $1, $2, ..., ${10}, ${11}, ... 轮替: shift [n]:位置参数轮替; 练习:写一脚本,通过命令传递两个文本文件路径给脚本,计算其空白行数之和; #!/bin/bash # file1_lines=$(grep "^$" $1 | wc -l) file2_lines=$(grep "^$" $2 | wc -l) echo "Total blank lines: $[$file1_lines+$file2_lines]" 特殊变量: $0:脚本文件路径本身; $#:脚本参数的个数; $*:所有参数 $@:所有参数 过程式编程语言的代码执行顺序: 顺序执行:逐条运行; 选择执行: 代码有一个分支:条件满足时才会执行; 两个或以上的分支:只会执行其中一个满足条件的分支; 循环执行: 代码片断(循环体)要执行0、1或多个来回; 选择执行: 单分支的if语句: if 测试条件 then 代码分支 fi 双分支的if语句: if 测试条件; then 条件为真时执行的分支 else 条件为假时执行的分支 fi 示例:通过参数传递一个用户名给脚本,此用户不存时,则添加之; #!/bin/bash # if ! grep "^$1\>" /etc/passwd &> /dev/null; then useradd $1 echo $1 | passwd --stdin $1 &> /dev/null echo "Add user $1 finished." fi #!/bin/bash # if [ $# -lt 1 ]; then echo "At least one username." exit 2 fi if ! grep "^$1\>" /etc/passwd &> /dev/null; then useradd $1 echo $1 | passwd --stdin $1 &> /dev/null echo "Add user $1 finished." fi #!/bin/bash # if [ $# -lt 1 ]; then echo "At least one username." exit 2 fi if grep "^$1\>" /etc/passwd &> /dev/null; then echo "User $1 exists." else useradd $1 echo $1 | passwd --stdin $1 &> /dev/null echo "Add user $1 finished." fi 练习1:通过命令行参数给定两个数字,输出其中较大的数值; #!/bin/bash # if [ $# -lt 2 ]; then echo "Two integers." exit 2 fi if [ $1 -ge $2 ]; then echo "Max number: $1." else echo "Max number: $2." fi #!/bin/bash # if [ $# -lt 2 ]; then echo "Two integers." exit 2 fi declare -i max=$1 if [ $1 -lt $2 ]; then max=$2 fi echo "Max number: $max." 练习2:通过命令行参数给定一个用户名,判断其ID号是偶数还是奇数; 练习3:通过命令行参数给定两个文本文件名,如果某文件不存在,则结束脚本执行; 都存在时返回每个文件的行数,并说明其中行数较多的文件; 练习: 1、创建一个20G的文件系统,块大小为2048,文件系统ext4,卷标为TEST,要求此分区开机后自动挂载至/testing目录,且默认有acl挂载选项; (1) 创建20G分区; (2) 格式化: mke2fs -t ext4 -b 2048 -L 'TEST' /dev/DEVICE (3) 编辑/etc/fstab文件 LABEL='TEST' /testing ext4 defaults,acl 0 0 2、创建一个5G的文件系统,卷标HUGE,要求此分区开机自动挂载至/mogdata目录,文件系统类型为ext3; 3、写一个脚本,完成如下功能: (1) 列出当前系统识别到的所有磁盘设备; (2) 如磁盘数量为1,则显示其空间使用信息; 否则,则显示最后一个磁盘上的空间使用信息; if [ $disks -eq 1 ]; then fdisk -l /dev/[hs]da else fdisk -l $(fdisk -l /dev/[sh]d[a-z] | grep -o "^Disk /dev/[sh]d[a-]" | tail -1 | cut -d' ' -f2) fi【Linux】【Shell】【Basic】条件测试和变量的更多相关文章
- Linux Shell 03 条件测试
条件测试 方式一:在Bash中 test命令和[]是等价的. test命令: if test $n1 -eq $n2 then echo "The two number are equal& ...
- Linux shell if条件判断2
前面介绍linux shell的if判断的语法,现在再补充一点. Linux shell if条件判断1 分支判断结构 if , case 下面两个结构语法,已经在前面有过示例. 结构1: ...
- Shell编程-条件测试 | 基础篇
什么是Shell Shell是一个命令解释器,它会解释并执行命令行提示符下输入的命令.除此之外,Shell还有另一个功能,如果要执行多条命令,它可以将这组命令存放在一个文件中,然后可以像执行Linux ...
- 二、shell 脚本条件测试
目录 一.条件测试 test 格式 文件测试 文件测试常见选项 整数值比较 字符串比较 浮点数的运算 逻辑测试 二.if语句 1单分支 2双分支结构 3多分支结构 三元运算符 三.case 一.条件测 ...
- 关于shell脚本——条件测试、if语句、case语句
目录 一.条件测试 1.1.表达说明 1.2.test命令 文件测试 1.3.整数值比较 1.4.字符串比较 1.5.逻辑测试 二.if语句 2.1.单分支结构 2.2.双分支结构 2.3.多分支结构 ...
- [Linux]Shell的运算符和特殊变量
说起Shell脚本,免不了用变量.特别是对于这种一堆符号表示变量的语言来说,你不了解一下相关变量的本意,根本无从下手.譬如写个循环遍历,$#就起了好大作用.所以还是有必要记录一下,也是对学习的一个笔记 ...
- shell脚本条件测试与比较
1.条件测试常用语法 test 测试表达式 利用test命令进行条件测试表达式,test命令与测试表达式之间至少有一个空格 [ 测试表达式 ] 通过[ ]中括号进行条件测试表达式,[]中括号边界与测试 ...
- Linux shell中一些参数与变量简介
linux中shell变量$#,$@,$0,$1,$2,$!,$$,$*,$-,$@......等很多个,很容易记错,这里再次整理一下,相关含义解释如下,并附上一个实践截图. 多看几次,多用几次,应该 ...
- Linux Shell编程 条件判断语法
if条件判断语句 单分支 if 条件语句 语法格式: if [条件判断式];then 程序 fi 或者 if [条件判断式] then 程序 fi 在使用单分支 if 条件查询时需要注意几点: if ...
随机推荐
- 大一C语言学习笔记(3)---对于程序员来说,学历和能力,到底哪个重要?
在高考失利后,我合理地萎靡一段时间,振作起来之后选择了我憧憬了10年的计算机专业---软件工程.但由于分数受限,也是选择了二本普通院校黑科技(我当然爱她,我的母校),而因为学历上的自卑,让我有了想考研 ...
- Linux常见目录结构
目录 描述 /home 包含Linux系统上各用户的主目录,子目录默认以该用户名命名 /etc 包含Linux系统上大部分的配置文件,建议修改配置文件之前先备份 /var 该目录存放不经常变化的数据, ...
- [Vue]浅谈Vue3组合式API带来的好处以及选项API的坏处
前言 如果是经验不够多的同志在学习Vue的时候,在最开始会接触到Vue传统的方式(选项式API),后边会接触到Vue3的新方式 -- 组合式API.相信会有不少同志会陷入迷茫,因为我第一次听到新的名词 ...
- Java设计模式之(二)——工厂模式
1.什么是工厂模式 Define an interface for creating an object,but let subclasses decide which class toinstant ...
- [loj6033]棋盘游戏
将棋盘黑白染色,即构成一张二分图 将状态用一张二分图$G$和一个点$x\in V$描述(分别为仍未被经过的点的导出子图和当前棋子所在位置),并称将要移动棋子的一方为先手 结论:先手必胜当且仅当$x$一 ...
- [ARC117F]Gateau
假设序列$b_{i}$为最终第$i$片上的草莓数,即需要满足:$\forall 0\le i<2n,a_{i}\le \sum_{j=0}^{n-1}b_{(i+j)mod\ 2n}$ 要求最小 ...
- [cf1215F]Radio Stations
这道题如果没有功率的限制,显然就是一个裸的2-sat 考虑将功率的限制也放在图上:如果选择了功率i,那么功率区间不包含它的点只能不选,连边即可 但是这样建图的边数是o(n^2),需要优化 将功率区间分 ...
- 『学了就忘』Linux软件包管理 — 49、拓展:Linux中通过脚本安装程序
目录 1.脚本程序简介 2.Webmin安装 (1)简介 (2)安装 (3)使用 1.脚本程序简介 脚本程序包并不多见,所以在软件包分类中并没有把它列为一类.它更加类似于Windows下的程序安装,有 ...
- Python+selenium之键盘和鼠标事件
- JAVA特点及安装卸载
C语言特点 1972 贴近硬件,运行速度快,效率高 操作系统,数据库,网络系统,编译器 指针和内存管理 C++语言特点 1982 面向对象 兼容C 图形领域,游戏等 Java语言特点 简单性 面向对象 ...