shell

本文详细介绍了Shell脚本的编写规范,包括代码缩进、执行方法、变量类型及其作用域,以及条件测试的基本语法、文件测试、字符串测试、整数测试和逻辑操作符。此外,还讲解了if条件语句的使用,提供了多个实际应用案例。

shell脚本编写规范

多使用内部命令
常用的内部命令有:echoevalexecexportreadshiftexit

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 i\thave\ta\tcat
ithavetatcat
[root@localhost test]# echo -e i\thave\ta\tcat
ithavetatcat
[root@localhost test]# echo -e "i\thave\ta\tcat"
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定义整型所以空间里
只能存放整型,这就是强类型。phpC#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 数字把这个数字以函数值的形式传给“$?”
$$
返回本程序的进程IDPID),不常用
$!
获取上一个在后台工作的进程的进程号,不常用
$_
保存之前执行的命令的最后一个参数,不常用

例:

[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,将84进行按位与运算,结果为0; 按位或,8|4,将84进行 按位或运算,结果为12; 按位非,~8,将8进行按位非运算,结果为-9(一个字 符占一个字节,即8个二进制位,最高位为1时为负数); 按位异或(a异或b, a、b值不同结果为1,相同结果为0),10^6,将106进行按二进制位异或运 算,结果为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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值