【Shell】Shell脚本语句

目录

一、条件语句

1.1 测试

1.2 比较整数数值

1.3 字符串比较

1.4 双中括号

1.5 ()与{}

1.6 if语句

1.7 case语句

1.8 echo命令

二、循环语句

2.1 for循环

2.2 while循环

2.3 until循环


一、条件语句

1.1 测试

格式一:test 条件表达式

格式二:[  条件表达式  ]

测试 是否成功使用 $?  返回值

操作符:
-d:测试是否为目录(Directory)
-e:测试目录或文件是否存在(Exist)
-a:测试目录或文件是否存在(Exist)   
-f:测试是否为文件(File)
-r:测试当前用户是否有权限读取(Read)
-w:测试当前用户是否有权限写入(Write)
-x:测试当前用户是否有权限执行(eXcute)
-L: 测试是否为软连接文件

属性测试补充:
-s FILE #是否存在且非空
-t fd #fd 文件描述符是否在某终端已经打开
-N FILE #文件自从上一次被读取之后是否被修改过
-O FILE #当前有效用户是否为文件属主
-G FILE #当前有效用户是否为文件属组

条件测试:判断某需求是否满足,需要由测试机制来实现,专用的测试表达式需要由测试命令辅助完成

测试过程,实现评估布尔声明,以便用在条件性环境下进行执行

若真,则状态码变量 $? 返回0

若假,则状态码变量 $? 返回1

1.2 比较整数数值

[  整数1  -操作符  整数2  ] 公式

操作符:

  • -eq:第一个数等于(Equal)第二个数

  • -ne:第一个数不等于(Not Equal)第二个数

  • -gt:第一个数大于(Greater Than)第二个数

  • -lt:第一个数小于(Lesser Than)第二个数

  • -le:第一个数小于或等于(Lesser or Equal)第二个数

  • -ge:第一个数大于或等于(Greater or Equal)第二个数

1.3 字符串比较

[  字符串1 =  字符串2 ]  是否相同

[  字符串1  !=  字符串2 ]  是否不相同

[  -z  字符串 ]   是否为空

[  -n  字符串 ] 字符是否存在

操作符:

        = :字符串内容相同

       != :字符串内容不同

       -z :字符串内容为空

       -n :字符串是否存在

1.4 双中括号

[[ expression ]] 用法

== 左侧字符串是否和右侧的PATTERN相同
 注意:此表达式用于[[ ]]中,PATTERN为通配符


=~ 左侧字符串是否能够被右侧的正则表达式的PATTERN所匹配
 注意: 此表达式用于[[  ]]中;扩展的正则表达式
#通配符
FILE=test.log
[[ "$FILE" == *.log ]]
echo $?
0

FILE=test.txt
[[ "$FILE" == *.log ]]
echo $?
1

[[ "$FILE" != *.log ]]
echo $?
0



#正则表达式以log结尾的文件
[[  $file   =~  log$   ]]

1.5 ()与{}

(CMD1;CMD2;...)和 { CMD1;CMD2;...;  } 都可以将多个命令组合在一起,批量执行

()会开启一个新的子bash,不会影响当前bash
( cd /data;ls )
不会改变当前的工作路径



{}不会影响当前的bash
{ cd /data;ls }
会改变当前的工作路径,需要主要{ }要与命令间有空格

1.6 if语句

单分支

格式一:
if    判断条件
then    条件为真后执行的代码
fi

格式二:
if    判断条件;then
条件为真后执行的代码
fi

双分支

if     判断条件
then
条件为真时执行的代码
else
条件为假时执行的代码
fi

多分支

if    判断条件1
then    条件1为真时执行的代码
elif    判断条件2
then    条件2为真时执行的代码
elif    判断条件3
then    条件3为真时执行的代码
else    以上条件全为假时执行的代码
fi

1.7 case语句

case    $i    in

PART1)        #满足PART1则执行分支1
分支1
;;
PART2)        #满足PART2则执行分支2
分支2
;;
PART3)        #满足PART3则执行分支3
分支3
;;
...
...
*)            #以上条件均不满足,则执行该分支
默认分支
;;

esac

注意!!

case只支持通配符:

* 任意长度任意字符        ?任意单个字符        [0-9]指定范围内的任意单个字符

1.8 echo命令

echo -n   表示不换行输出
echo -e   表示输出转义符

选项作用
\r光标移至行首,并且不换行
\s当前shell的名称,如bash
\t插入Tab键,制表符,可用于写脚本时对齐
\n输出换行
\f换行,但光标仍停留在原处
\表示插入"\"本身转义
\b表示退格 不显示前一个字符
\c抑制更多的输出或不换行

二、循环语句

2.1 for循环

语法1:

for    变量名    in    {list}    #list表中有多少个量就执行多少次
do
    command
done

花括号{}和seq在for循环的应用:
for i in {1..50..2} 1-50的奇数

for i in {2..50..2} 1-50的偶数
for i in {10..1}  1-10倒序排列

for i in $(seq 10)  1-10正序排列
for i in $(seq 10 -1 1) 1-10倒序排列
for i in $(seq 1 2 10) 1-10的奇数,中间为步长
语法2:

for    ((expr1;expr2;expr3))
do
    command
done

expr1:定义变量并赋初值
expr2:定义条件,决定是否循环
expr3:决定循环变量如何改变,决定循环什么时候退出

拓展举例:


99乘法表

方法1:

#!/bin/bash
for j in {1..9}
do
    for i in `seq $j`
    do
	 echo -e "${i}x${j}=$[i*j] \t\c"
	 #\t tab键可以对齐
    done
echo    #打印换行

done

方法2:

#!/bin/bash

for ((i=1;i<=9;i++))
do
  for ((j=1;j<=i;j++))
  do
  echo -e "${j}x${i}=$[i*j] \t\c"
  done
echo   #打印换行

done

2.2 while循环

语句:

while    循环条件        #满足条件则进行循环
do
    command
done

拓展举例


批量建立用户

#!/bin/bash
i=0
while [ "${i}" -le 20 ]
do
useradd stu${i}
echo "123456" |passwd --stdin stu${i} &>/dev/null
if [ $? -eq 0 ]
then
echo "用户 stu${i} 被建立"
else
echo "用户 stu${i} 建立失败"
fi
let i++
done

跳出循环的方式:

  • break跳出单个循环 break n 数字数字是几代表跳出n层循环

  • continue终止某次循环中的命令,但是不会完全终止命令

  • exit 直接退出脚本

2.3 until循环

语句:

until    条件    #当不满足条件时,执行循环
do
    command
done

 拓展举例


定时给某用户发消息

#!/bin/bash
username=$1            #定义变量
if [ $# -lt 1 ]        #若允许脚本后未在后定义预定义变量,则提示信息
then
echo "请在脚本后输入 用户名和发送信息" 
exit 
fi

if  grep "^$username" /etc/passwd &>/dev/null
then :
else
 echo "用户不存在"
 exit 
fi


until who |grep $username &>/dev/null
do
echo "用户不在线"
sleep 5
done

mes=$2
echo $mes |write $username
  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值