我是靠谱客的博主 结实硬币,最近开发中收集的这篇文章主要介绍shell三、Shell条件测试四、流程控制之条件判断,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

shell脚本编写规范

多使用内部命令
常用的内部命令有: echo eval exec export read shift exit

echo:可在屏幕上输出信息

echo参数选项说明
-n不换行输出内容
-e解析转义字符
转义字符说明
n换行
r回车
t制表符
b退格
v纵向制表符
[root@localhost test]# echo -n i have a cat
i have a cat[root@localhost test]# 
[root@localhost test]# echo ithavetatcat
ithavetatcat
[root@localhost test]# echo -e ithavetatcat
ithavetatcat
[root@localhost test]# echo -e "ithavetatcat"
i	have	a	cat
[root@localhost test]# echo -n {1..6}
1 2 3 4 5 6[root@localhost test]# 

 eval:命令格式:eval args

功能:当 shell 程序执行到 eval 语句时, shell 读入参数 args ,并将它们组合成一个新的命令,然后执
行。
[root@localhost test]# a='shell;head -1 /etc/passwd'
[root@localhost test]# echo $a
shell;head -1 /etc/passwd
[root@localhost test]# eval echo $a
shell
root:x:0:0:root:/root:/bin/bash

exec:exec命令能够在不创建新的子进程的前提下,转去执行指定的命令,当指定的命令执行完毕后,该进程就终止了。

[root@localhost test]# exec cd /home

Connection closed.

Disconnected from remote host(192.168.10.128:22) at 20:03:30.

Type `help' to learn how to use Xshell prompt.
[C:~]$ 

export

[root@localhost test]# export
declare -x DBUS_SESSION_BUS_ADDRESS="unix:path=/run/user/0/bus"
declare -x DISPLAY="localhost:10.0"
declare -x HISTCONTROL="ignoredups"
declare -x HISTSIZE="1000"
declare -x HOME="/root"
declare -x HOSTNAME="localhost.localdomain"
declare -x LANG="en_US.UTF-8"
declare -x LESSOPEN="||/usr/bin/lesspipe.sh %s"
declare -x LOGNAME="root"
declare -x LS_COLORS="rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:mi=01;05;37;41:su=37;41:sg=30;43:ca=30;41:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arc=01;31:*.arj=01;31:*.taz=01;31:*.lha=01;31:*.lz4=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.tzo=01;31:*.t7z=01;31:*.zip=01;31:*.z=01;31:*.dz=01;31:*.gz=01;31:*.lrz=01;31:*.lz=01;31:*.lzo=01;31:*.xz=01;31:*.zst=01;31:*.tzst=01;31:*.bz2=01;31:*.bz=01;31:*.tbz=01;31:*.tbz2=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.war=01;31:*.ear=01;31:*.sar=01;31:*.rar=01;31:*.alz=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.cab=01;31:*.wim=01;31:*.swm=01;31:*.dwm=01;31:*.esd=01;31:*.jpg=01;35:*.jpeg=01;35:*.mjpg=01;35:*.mjpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.webm=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=01;36:*.au=01;36:*.flac=01;36:*.m4a=01;36:*.mid=01;36:*.midi=01;36:*.mka=01;36:*.mp3=01;36:*.mpc=01;36:*.ogg=01;36:*.ra=01;36:*.wav=01;36:*.oga=01;36:*.opus=01;36:*.spx=01;36:*.xspf=01;36:"
declare -x MAIL="/var/spool/mail/root"
declare -x OLDPWD="/root"
declare -x PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin"
declare -x PWD="/root/test"
declare -x SELINUX_LEVEL_REQUESTED=""
declare -x SELINUX_ROLE_REQUESTED=""
declare -x SELINUX_USE_CURRENT_RANGE=""
declare -x SHELL="/bin/bash"
declare -x SHLVL="1"
declare -x SSH_ASKPASS="/usr/libexec/openssh/gnome-ssh-askpass"
declare -x SSH_CLIENT="192.168.10.1 54521 22"
declare -x SSH_CONNECTION="192.168.10.1 54521 192.168.10.128 22"
declare -x SSH_TTY="/dev/pts/0"
declare -x TC_LIB_DIR="/usr/lib64/tc"
declare -x TERM="xterm"
declare -x USER="root"
declare -x XDG_DATA_DIRS="/root/.local/share/flatpak/exports/share:/var/lib/flatpak/exports/share:/usr/local/share:/usr/share"
declare -x XDG_RUNTIME_DIR="/run/user/0"
declare -x XDG_SESSION_ID="8"
declare -x which_declare="declare -f"

read:read命令可从标准输入读取字符串等信息,传给shell程序内部定义的变量。

[root@localhost test]# read -p "please input a string: " -t 5 str_data
please input a string: lili
[root@localhost test]# echo $str_data
lili
[root@localhost test]# echo -n "please input your name:"; read name1 name2
please input your name:haha hehe
[root@localhost test]# echo $name1
haha
[root@localhost test]# echo $name2
hehe
[root@localhost test]# 
[root@localhost test]# read name1
xian
[root@localhost test]# echo $name1
xian
shift: 在程序中每使用一次 shift 语句,都会使所有的位置参数依次向左移动一个位置,并使位置参
$# 1 ,直到减到 0 为止。

[root@localhost test]# vim shift_test.sh
[root@localhost test]# bash shift_test.sh 123 456
2

[root@localhost test]# bash 8.17.sh 123 456
2
123 456
8.17.sh
123
1
456

反引号  $(): 显示当前工作路径

[root@localhost test]# data=`pwd`
[root@localhost test]# echo $data
/root/test
[root@localhost test]# data=$(pwd)
[root@localhost test]# echo $data
/root/test

exit:退出shell程序。在exit之后可以有选择地指定一个数作为返回状态

[root@localhost test]# vim exit_test.sh
[root@localhost test]# bash exit_test.sh
222

 代码缩进

[root@localhost test]# vim ~/.vimrc

执行脚本的方法

[root@localhost test]# vim test_1.sh
#!/bin/bash
cd /tmp
pwd
[root@localhost test]# ls -l test_1.sh 
-rw-r--r--. 1 root root 23 Aug 17 11:20 test_1.sh

 1、bash ./filename.sh(产生子进程,再运行,使用当前指定的bash shell去运行)

[root@localhost test]# bash test_1.sh 
/tmp

2、./filename.sh(产生子进程,再运行,使用脚本里面指定的shell去运行。使用该种方式执行需要x权限)

[root@localhost test]# chmod +x test_1.sh 
[root@localhost test]# ./test_1.sh 
/tmp

3、source ./filename.sh(source命令是一个shell内部命令,其功能是读取指定的shell程序文件,并且依次执行其中的所有的语句,并没有创建新的子shell进程,所以脚本里面所有创建的变量都会保存到当前的shell里面)

[root@localhost test]# source test_1.sh 
/tmp

4、. filename.sh(和source一样,也是使用当前进程执行)

[root@localhost test]# . test_1.sh 
/tmp

变量的类型

Shell 是一种动态类型语言和弱类型语言 ,即在 Shell 中,变量的数据类型毋需显示地声明,变量的
数据类型会根据不同的操作有所变化。准确地讲, Shell 中的变量是不分数据类型的,统一地按照字符串
存储。但是根据变量的上下文环境,允许程序执行一些不同的操作,例如字符串的比较和整数的加减等
等。
什么是弱类型语言、强类型语言?
强类型和弱类型主要是站在变量类型处理的角度进行分类的。强类型是指不允许隐式变量类型转换,弱
类型则允许隐式类型转换。
强类型语言,当你定义一个变量是某个类型,如果不经过代码显式转换(强制转化)过,它就永远
都是这个类型,如果把它当做其他类型来用,就会报错
弱类型语言,你想把这个变量当做什么类型来用,就当做什么类型来用,语言的解析器会自动(隐
式)转换。
比如:
C 语言定义变量, int+ 变量名,实则前面的 int 就是给变量内存划分了等级, int 定义整型所以空间里
只能存放整型,这就是强类型。 php C# Python 等都是强类型语言。

可以使用 declare 定义变量的类型: declare attribute variable
-p :显示所有变量的值
-i :将变量定义为整数,在之后就可以直接对表达式求值,结果只能是整数。如果求值失败或者不是整
数,就设置为 0
-r :将变量声明为只读变量。只读变量不允许修改,也不允许删除。 ( 也可使用 readonly 定义只读变量 )
-a :变量声明为数组变量。但这没有必要,所有变量都不必显示定义就可以用作数组。事实上,在某
种意义上,似乎所有变量都是数组,而且赋值给没有下标的变量与赋值给下标为 0 的数组元素相同。
-f :显示所有自定义函数,包括名称和函数体。
-x :将变量设置成环境变量。可使用 +x 将变量变成非环境变量
 

根据作用域分类

根据作用域可将变量分为环境变量(全局变量)和普通变量(局部变量)

1、环境变量

环境变量也可称为全局变量,可以在创建它们的 shell 及其派生出来的任意子进程 shell 中使用( su -
切换用户会读取新的环境变量),环境变量又可分为自定义环境变量和 bash 内置的环境变量。
(1)自定义环境变量
一般是指用 export 内置命令导出的变量,用于定义 shell 的运行环境,保证 shell 命令的正确执行。
境变量可以在命令行中设置和创建,但用户退出命令行时这些变量值就会丢失 ,即该环境变量只在当前
shell 和子 shell 中有效。如果希望永久保存环境变量,可以在配置文件中设置。
①用户的环境变量配置( non-login shell
~/.bash_profile ~/.bashrc
②全局环境变量的配置( login shell
/etc/bashrc /etc/profile 文件或者 /etc/profile.d 目录中定义。

(2)bash内置的环境变量

shell内置的环境变量是所有的shell程序都可以使用的变量。shell程序在运行时,都会接收一组变量 来确定登录用户名、命令路径、终端类型、登录目录等,这组变量就是环境变量。环境变量会影响到所 有的脚本的执行结果。

变量
说明
PATH
命令搜索路径,以冒号为分隔符
HOME
用户主目录的路径名,是 cd 命令的默认参数
COLUMNS
定义了命令编辑模式下可使用命令行的长度
HISTFILE
命令历史文件
HISTSIZE
命令历史文件中最多可包含的命令条数
HISTFILESIZE
命令历史文件中包含的最大行数
IFS
定义 shell 使用的分隔符
LOGNAME
当前的登录名
SHELL
shell 的全路径名
TERM
终端类型
TMOUT
shell 自动退出的时间,单位为秒,若设为 0 则禁止 shell 自动退出
PWD
当前工作目录

2、普通变量

普通变量也可称为局部变量,与全局变量相比,局部变量的使用范围较小,通常仅限于某个程序段访 问,例如函数内部。在Shell 语言中,可以在函数内部通过 local 关键字定义局部变量,另外,函数的参数 也是局部变量

区别

[root@localhost ~]# vim 6.sh 
#!/bin/bash 
#定义函数 
func() 
{ 
  #输出全局变量v1的值 
  echo "global variable v1 is $v1" 

  #定义局部变量v1 
  local v1=2 

  #输出局部变量v1的值 
  echo "local variable v1 is $v1" 
}

#定义全局变量v1 
v1=1
 
#调用函数 
func 

  #输出全局变量v1的值 
echo "global variable v1 is $v1" 
[root@localhost test]# chmod a+rx var.sh
[root@localhost test]# ./var.sh 
global variable v1 is 1 
local variable v1 is 2 
global variable v1 is 1

变量的定义

引用变量: $ 变量名 或者 ${ 变量名 }
查看变量: echo $ 变量名, set (可查看所有变量:包括自定义变量和环境变量), env 显示全局变量,
declare 输出所有的变量、函数、整数和已经导出的变量。
取消变量: unset 变量名
作用范围:仅在当前 shell 中有效
位置参数和预定义变量
变量说明
$#
命令行参数的个数
$n
表示传递给脚本的第 n 个参数,例如 $1 表示第一个参数, $2 表示第二个参数, $3 表示第三 个参数
$0
当前脚本的名称
$*
" 参数 1 参数 2 参数 3…" 的形式返回所有参数的值
$@
参数 1”“ 参数 2”“ 参数 3”… 的形式返回所有的值
$?
前一个命令或者函数的返回状态码。 $? 的返回值用法:
(1)判断命令、脚本或函数等程序
是否执行成功
(2)若在脚本中调用执行 “exit 数字 ,则会返回这个数字给 “$?” 变量
(3)如 果是在函数里,则通过“return 数字 把这个数字以函数值的形式传给 “$?”
$$
返回本程序的进程 ID PID ),不常用
$!
获取上一个在后台工作的进程的进程号,不常用
$_
保存之前执行的命令的最后一个参数,不常用

例:

[root@localhost tmp]# vim test_2.sh

#!/bin/bash
#########################
#File name:test_2.sh
#Version:v1.0
#Email:admin@test.com
#Created time:2022-08-17 11:51:47
#Description:
#########################
echo $#
echo $@
echo $*
echo $0
echo $1
echo $2
echo $?
   
[root@localhost tmp]# bash test_2.sh 985 211
2
985 211
985 211
test_2.sh
985
211
0

变量的运算

与其他的程序设计语言一样, shell 也有很多运算符。
运算符说明
+ -
求和、差
* / %
求乘积,商,余数
**
幂运算,例如 3**3 是求 3 的立方,即 27
+= -= 、 *=、 /= %=
a+=1 相当于 a=a+1
++variable - -variable
先将变量 variable 的值加 1 ,然后再赋给 variable ; 先将变量 variable 的值减 1 , 然后再赋给variable
variable++ 、 variable--
先使用 variable 的值,然后再将该变量的值加 1 ; 先使用 variable 的值,然后再 将该变量的值减1
位运算符 << 、 >>
位运算通常出现在整数间,它针对的不是整个整数,而是其二进制表示形式中的 某个或者某些位(bit )。例如, 2>>1 是将二进制形式的 2 ,即 10 ,左移 1 位,从 而变成100 ,即 4 。 左移, 4<<2 ,将 4 左移 2 位,结果为 16 ; 右移, 8>>2 ,将 8 右移两位,结果为2
& | ~ ^
按位与, 8&4 ,将 8 4 进行按位与运算,结果为 0 ; 按位或, 8|4 ,将 8 4 进行 按位或运算,结果为12 ; 按位非, ~8 ,将 8 进行按位非运算,结果为 -9 (一个字 符占一个字节,即8 个二进制位,最高位为 1 时为负数); 按位异或(a异或 b , a、 b 值不同结果为 1 ,相同结果为 0 ), 10^6 ,将 10 6 进行按二进制位异或运 算,结果为12
<<= >>=
将变量的值左移指定位数之后重新赋给该变量, x<<=3 ,将 x 的值左移 3 位,重新 赋给变量x ; 将变量的值右移指定位数之后重新赋给该变量, x>>=4 ,将变量 x 的 值右移4 位后重新赋给变量 x
&= |= ^=
将变量的值与指定的数值按位与之后重新赋给该变量 x&=8 ,将变量 x 的值与 8 按位与运算之后重新赋给变量x ; 将变量的值与指定的数值按位或之后重新赋给 该变量,x|=7 ,将变量 x 的值与 7 执行按位或运算之后重新赋给变量 x ; 将变量的 值与指定的数值按位异或之后重新赋给该变量,x^=9 ,将变量 x 的值与 9 执行按 位异或运算之后重新赋给变量x
作符与 运算命
运算命令意义
说明
(())
用于整数运 算的常用运 算符
(()) 中使用变量时可以去掉变量前的 $ 符号
let
用于整数运 算
使用 let 命令可以执行一个或者多个算术表达式,其中的变量名毋需使用$ 符号
expr
可用于整数 运算,但还 有很多其他 的额外功能
使用 expr 时,运算符及用于计算的数字左右都至少有一个空格,否则
会报错;使用乘号时,必须使用反斜线屏蔽其特定含义;使用 expr
计算,将一个未知的变量和一个已知的整数相加,看返回码是否为
0 ,如果为 0 就认为做加法的变量为整数,否则就不是整数。
bc
linux 下的一 个计算器程 序(适合整 数及小数运 算)
[root@node13 test9]# echo `seq -s "+" 10` = `seq -s "+" 10 | bc
`
seq 是生成数字序列, -s 是指定数字序列之间的分隔符
$[]
用于整数运 算
awk
awk 既可以 用于整数运 算,也可以 用于小数运 算
declare
定义变量值 和属性,-i 参数可以用 于定义整形 变量,做运 算

[root@localhost 20220816]# vim 1.sh
[root@localhost 20220816]# bash 1.sh 6 2
num1+num2=8
4
3
12
8

[root@localhost 20220816]# declare -i r=1+5
[root@localhost 20220816]# echo $r
6
表达式
说明
${parameter}
返回变量的内容
${#parameter}
返回变量内容的长度(按字符)
${paramater:offset}
在变量 ${parameter} 中,从位置 offset 之后开始提取子串到结 尾
${paramater:offset:length}
在变量 ${parameter} 中,从位置 offset 之后开始提取长度为 length的子串
${parameter#word}
从变量 ${parameter} 开头开始删除最短匹配的 word 子串
${parameter##word}
从变量 ${parameter} 开头开始删除最长匹配的 word 子串
${parameter%word}
从变量 ${parameter} 结尾开始删除最短匹配的 word 子串
${parameter%%word}
从变量 ${parameter} 结尾开始删除最长匹配的 word 子串
${parameter/pattern/string}
使用 string 代替第一个匹配的 pattern
${parameter//pattern/string}
使用 string 代替所有匹配的 pattern

${#parameter}    :返回变量内容的长度(按字符)

[root@localhost 20220816]# str1="nice to meet you"
[root@localhost 20220816]# echo ${#str1}
16

${parameter#word}  :从变量${parameter}开头开始删除最短匹配的word子串

[root@localhost 20220816]# filename=testfile.tar.gz
[root@localhost 20220816]# file=${filename#*.}
[root@localhost 20220816]# echo $file
tar.gz

${parameter##word}  :从变量${parameter}开头开始删除最长匹配的word子串

[root@localhost 20220816]# filename=testfile.tar.gz
[root@localhost 20220816]# file=${filename##*.}
[root@localhost 20220816]# echo $file
gz

${parameter%word}:  从变量${parameter}结尾开始删除最短匹配的word子串

[root@localhost 20220816]# filename=testfile.tar.gz
[root@localhost 20220816]# file=${filename%.*}
[root@localhost 20220816]# echo $file
testfile.tar

${parameter%%word}:  从变量${parameter}结尾开始删除最长匹配的word子串

[root@localhost 20220816]# filename=testfile.tar.gz
[root@localhost 20220816]# file=${filename%%.*}
[root@localhost 20220816]# echo $file
testfile

${paramater:offset}:  在变量${parameter}中,从位置offset之后开始提取子串到结

[root@localhost 20220816]# str1="nice to meet you"
[root@localhost 20220816]# echo ${str1:1}
ice to meet you
[root@localhost 20220816]# echo ${str1:3}
e to meet you
${paramater:offset:length}:   在变量 ${parameter} 中,从位置 offset 之后开始提取长度为
length 的子串
[root@localhost 20220816]# str1="nice to meet you"
[root@localhost 20220816]# echo ${str1:1:3}
ice 
[root@localhost 20220816]# echo ${str1:0:3}
nic

三、Shell条件测试

3.1条件测试的基本语法

shell 程序中,用户可以使用测试语句来测试指定的条件表达式的条件的真或假。当指定的条件为
真时,整个条件测试的返回值为 0 ;反之,如果指定的条件为假,则条件测试语句的返回值为非 0 值。

 3.2逻辑操作符

 3.3文件测试表达式

1、 test示例:test命令和<测试表达式>之间至少有一个空格

[root@localhost 20220823]# ll
total 0
-rw-r--r--. 1 root root 0 Aug 23 15:07 file1
drwxr-xr-x. 2 root root 6 Aug 23 15:04 test1.sh
[root@localhost 20220823]# test -f file1;echo $?
0
[root@localhost 20220823]# test -f file2;echo $?
1
[root@localhost 20220823]# test -x file2;echo $?
1

2、[]示例:该方法和test命令的用法一样,[]的边界和内容之间至少有一个空格

[root@localhost 20220823]# ll
total 0
-rw-r--r--. 1 root root 0 Aug 23 15:07 file1
[root@localhost 20220823]# [ -f file1 ];echo $?
0
[root@localhost 20220823]# [ -f file2 ];echo $?
1
[root@localhost 20220823]# [ -w file1 ];echo $?
0

3、示例:比test[]更新的语法格式。[[]]的边界和内容之间至少有一个空格。[[]]中可

以使用通配符等进行模式匹配
[root@localhost 20220823]# [[ -f file1 ]];echo $?
0
[root@localhost 20220823]# [[ -f file2 ]];echo $?
1
[root@localhost 20220823]# [[ -x file1 ]];echo $?
1
[root@localhost 20220823]# ll
total 0
-rw-r--r--. 1 root root 0 Aug 23 15:07 file1

3.4字符串测试表达式

 1、test示例

[root@localhost test3]# test -n abc;echo $? 
0
[root@localhost test3]# test -n "";echo $? 
1
[root@localhost test3]# test -n " ";echo $? 
0
[root@localhost test3]# test -z '';echo $? 
0
[root@localhost test3]# test -z abc;echo $? 
1
[root@localhost test3]# test -z ' ';echo $? 
1
[root@localhost test3]# test abc = abcd ;echo $? #注意等号两边需要有空格 
1
[root@localhost test3]# test abc=abcd ;echo $? 
0

2、[]示例

[root@localhost test3]# [ -n '' ];echo $? 
1
[root@localhost test3]# [ -n ' ' ];echo $? 
0
[root@localhost test3]# [ -z '' ];echo $? 
0
[root@localhost test3]# [ abc=abcd ];echo $? 
0
[root@localhost test3]# [ abc = abcd ];echo $? #注意等号两边需要有空格
1

3、[[]]示例

[root@localhost test3]# [[ -n abc ]];echo $? 
0
[root@localhost test3]# [[ -n ' ' ]];echo $? 
0
[root@localhost test3]# [[ -n '' ]];echo $? 
1
[root@localhost test3]# [[ abc=acd ]] ;echo $? 
0
[root@localhost test3]# [[ abc = acd ]] ;echo $? #注意等号两边需要有空格 
1
注意:测试对象是变量时,变量需要加引号
[root@localhost test3]# test -n $name;echo $? 
0
[root@localhost test3]# test -n "$name";echo $? 
1
[root@localhost test3]# [ -n $name ];echo $? 
0
[root@localhost test3]# [ -n "$name" ];echo $? 
1

3.5整数测试表达式

 1、test示例

[root@localhost 20220823]# test 2 -eq 9;echo $?
1
[root@localhost 20220823]# test 2 -eq 2;echo $?
0

2、[]示例

[root@localhost 20220823]# [ 2 -ne 1 ];echo $?
0
[root@localhost 20220823]# [ 2 -ne 2 ];echo $?
1

3、[[]]示例: [[]]中也可使用包含-gt-lt的符号,不建议使用;

[root@localhost test3]# [[ 2 != 3 ]];echo $? 
0
[root@localhost test3]# [[ 2 != 2 ]];echo $? 
1
[root@localhost test3]# [[ 2!=2 ]];echo $? 未写空格,导致出错 0
0

4、(())示例

[root@localhost test3]# (( 2!=3 ));echo $? 
0
[root@localhost test3]# ((2!=3));echo $? 
0
[root@localhost test3]# ((2=3));echo $? 
-bash: ((: 2=3: attempted assignment to non-variable (error token is "=3") 
1
[root@localhost test3]# ((2==3));echo $? 
1
[root@localhost test3]# ((2>3));echo $? 
1
[root@localhost test3]# ((2<3));echo $? 
0

3.5 逻辑操作符

 1、test示例

[root@localhost test3]# ll 
total 0 
drwxr-xr-x. 2 root root 6 Feb 20 11:47 ceshi 
-rw-r--r--. 1 root root 0 Feb 20 10:46 file 
[root@localhost test3]# test -f file && echo 1 ||echo 0 
1
[root@localhost test3]# test -f file1 && echo 1 ||echo 0 
0
[root@localhost test3]# ! test -f file;echo $? 
1

四、流程控制之条件判断

4.1 if条件语句的语法及案例

判断当前主机的CPU生产商,其信息在/proc/cpuinfo文件中vendor_id一行中。

[root@localhost 20220823]# vim vendor.sh
[root@localhost 20220823]# chmod +x vendor.sh 
[root@localhost 20220823]# ./vendor.sh 
unknow
[root@localhost 20220823]# cat vendor.sh 
#!/bin/bash
vendor=$(grep "vendor_id" /proc/cpuinfo | uniq|awk -F: '{print $NF}' )
if [[ "$vendor" =~ [[:apace:]]*GenuineIntel]$ ]]
then
  echo "intel"
elif [[ "$vendor" =~ [[:apace:]]*AuthenticAMD$ ]]
then
  echo "AMD"
else
  echo "unknow"
fi

根据用户输入成绩,判断优良中差(A,B,C,D, 注意边界问题)

[root@localhost 20220823]# vim file1.sh

[root@localhost 20220823]# bash file1.sh 
please input your score99
A
[root@localhost 20220823]# bash file1.sh 
please input your score82
B
[root@localhost 20220823]# bash file1.sh 
please input your score66
C
[root@localhost 20220823]# bash file1.sh 
please input your score30
D

判断 sshd 进程是否运行,如果服务未启动则启动相应服务。

分析:判断进程是否运行
方法 1 :查看进程
[root@localhost 20220823]# ps -ef | grep ssh | grep -v grep | wc -l
3
方法 2 :查看端口
[root@localhost 20220823]# ss -lntup | grep -w 22 | wc -l
2
[root@localhost 20220823]# netstat -lntup | grep -w 22 | wc -l
2

[root@localhost 20220823]# vim sshd_running.sh
[root@localhost 20220823]# cat sshd_running.sh 
#!/bin/bash
result=`ps -ef | grep sshd | grep -v grep | wc -l`
if [$result -ge 1 ];then
  echo sshd is running
else
  echo sshd is not running
  systemctl start sshd >/dev/null
fi

[root@localhost 20220823]# chmod a+rx sshd_running.sh 
[root@localhost 20220823]# ./sshd_running.sh 
./sshd_running.sh: line 3: [5: command not found
sshd is not running

检查主机是否存活,并输出结果
[root@localhost 20220823]# vim ping.sh
[root@localhost 20220823]# chmod +x ping.sh
[root@localhost 20220823]# ./ping.sh 
host 192.168.10.128 is not running
[root@localhost 20220823]# cat ping.sh 
#!/bin/bash
ping -c 2 -w 1 192.168.10.128 &> /dev/null
if [ $? -eq 0 ];then
  echo host 192.168.10.128 is running
else
  echo host 192.168.10.128 is not running
fi

最后

以上就是结实硬币为你收集整理的shell三、Shell条件测试四、流程控制之条件判断的全部内容,希望文章能够帮你解决shell三、Shell条件测试四、流程控制之条件判断所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(66)

评论列表共有 0 条评论

立即
投稿
返回
顶部