Linux bash/sh/shell编程中的if语句应该怎么写

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux bash/sh/shell编程中的if语句应该怎么写相关的知识,希望对你有一定的参考价值。

line="#abcmatch
BCD"
REGEXP="^[#]"
#
变量赋值不需要前缀$
if
[[
$line
=~
$REGEXP
]]
&&
[[
$line
!=
''
]];
then
#粗心
[[
]]
要配对使用
你写成了
[[
]
[
]]
true
#shell
不能使用空的if
结构,至少要有一个命令。
可以使用true命令

echo
yes
else
echo
NO
fi
###
end
另外Bash
不支持完全的正则表达式。[[
“$line”
=~
“$REGEXP”
]]
不能达到你想要的效果。
需要使用echo
"$string"|
grep
-qP
/regexp/
Zsh
支持完整的正则表达式,
[[
“$line”
=~
“$REGEXP”
]]
能达到你想要的效果。
参考技术A #!/bin/sh是指此脚本使用/bin/sh来解释执行,#!是特殊的表示符,其后面根的是此解释此脚本的shell的路径。$bash$表示系统提示符,$表示此用户为普通用户,超级用户的提示符是#,bash是shell的一种,是linux下最常用的一种shell,$bash的意思是执行一个子shell,此子shell为bash。

Shell编程初步

一:Hello World

新建一个文件,命名时以 .sh 为后缀。每个bash文件开头第一行表名文件类型: #!/bin/bash

然后在下面输入代码。

比如输出hello world:

#!/bin/bash
echo "hello world"

运行bash文件: ./文件名.sh

(在终端创建的文件用vim编辑保存,ubuntu可以在图形化界面new一个空白文档,通过后缀名识别为bash文件)

 

二:变量

shell中定义变量,有以下规则:

  • 首个字符必须为字母(a-z,A-Z)。
  • 中间不能有空格,可以使用下划线(_)。
  • 不能使用标点符号。
  • 不能使用bash里的关键字
  • 变量名和等号之间不能有空格;

 

使用对象:使用 ${变量名} 获取变量,如同EL表达式一样。如:${name}

只读变量:在赋值后可以用readonly修饰变量成为只读,相当于final常量

#!/bin/bash
name=“ygj”
readonly name

变量类型:

  • 1) 局部变量 局部变量在脚本或命令中定义,仅在当前shell实例中有效,其他shell启动的程序不能访问局部变量。
  • 2) 环境变量 所有的程序,包括shell启动的程序,都能访问环境变量,有些程序需要环境变量来保证其正常运行。必要的时候shell脚本也可以定义环境变量。
  • 3) shell变量 shell变量是由shell程序设置的特殊变量。shell变量中有一部分是环境变量,有一部分是局部变量,这些变量保证了shell的正常运行

 

字符串:用 “”或‘’括起来

字符串拼接:不需要运算符,直接连着写或者用 ${name} 把要拼接的内容直接写到新定义的字符串里。如:

#!/bin/bash
str1="i am str1"
str2="you are str2,and"str1
str3="she is str3,${str2}"

获取字符串长度: #strname 即可,如:

#!/bin/bash
str1="i am str1"
echo ${#str1}

截取字符串: strname:beginindex:endindex,如:

#!/bin/bash
str1="i am str1"
str2=${str1:0:2}

字符串中查找子串或字符下标: `expr index "${strname}" 查找内容` (注意:前后两个反引号。在键盘的Esc下面按钮)

#!/bin/bash
str1="i am str1"
echo `expr index "${str1}" am`

 

Shell数组:

定义数组:arrname=(value0 value1。。。)(注意:元素之间通过空格隔开,不是逗号!)也可以逐个赋值 arrname[i]=value_i。

Shell数组没有范围限制,访问时只通过下标访问,下标从0开始。

访问数组元素:${arrname[index]}

访问全部元素:${arrname[@]}

获得数组长:用 # 运算符:${#arrname[@]}

获取单个元素内容的长:用 # 运算符:${#arrname[index]}

 

Shell注释:用#开头的行都是注释

 

三:向bash文件传递参数

在终端启动bash文件时,可以在文件名后增加传入的参数值,如:

./test.sh ygj 0930 22

在bash文件中获取参数: $n ,n指传进来的第几个参数,从1开始。如:

#!/bin/bash
echo “No.1 parameter is:$1

统计参数个数:$#

把所有参数以一个字符串形式返回:$*

把所有参数单独逐个返回:[email protected]

显示运行当前脚本的进程ID:$$

 

四:运算符

运算符主要有以下几种:

 

算术运算符:+-*/%,==,!=

bash的运算表达式不能直接计算出数学运算的结果,需要用 `expr 表达式`(反引号)  命令解析表达式才可获取结果。另外,表达书写时要求数字、变量与运算符之间有空格,否则只是简单的字符串而已。如:

#!/bin/bash
echo `expr 1 + 1`

 

下面的运算符使用不需要expr,但需要放在 [] 中,并且两边留空格,运算符与操作数之间也留空格。如:[ num1 op num2 ]

关系运算符(关系运算符只支持数字,不支持字符串):

-eq 检测两个数是否相等,相等返回 true。

-ne 检测两个数是否相等,不相等返回 true。

-gt 检测左边的数是否大于右边的,如果是,则返回 true。

-lt 检测左边的数是否小于右边的,如果是,则返回 true。

-ge 检测左边的数是否大于等于右边的,如果是,则返回 true。

-le 检测左边的数是否小于等于右边的,如果是,则返回 true。

 

布尔运算符:

-o 或运算,有一个表达式为 true 则返回 true。

-a 与运算,两个表达式都为 true 才返回 true。

! 非运算,表达式为 true 则返回 false,否则返回 true。

 

逻辑运算符:

&& 逻辑与

|| 逻辑或

 

字符串操作运算符:

= 检测两个字符串是否相等,相等返回 true。

!= 检测两个字符串是否相等,不相等返回 true。

-z 检测字符串长度是否为0,为0返回 true。

-n 检测字符串长度是否为0,不为0返回 true。

 

文件操作运算符:

-b file 检测文件是否是块设备文件,如果是,则返回 true。

-c file 检测文件是否是字符设备文件,如果是,则返回 true。

-d file 检测文件是否是目录,如果是,则返回 true。

-f file 检测文件是否是普通文件(既不是目录,也不是设备文件),如果是,则返回 true。

-g file 检测文件是否设置了 SGID 位,如果是,则返回 true。

-k file 检测文件是否设置了粘着位(Sticky Bit),如果是,则返回 true。

-p file 检测文件是否是有名管道,如果是,则返回 true。

-u file 检测文件是否设置了 SUID 位,如果是,则返回 true。

-r file 检测文件是否可读,如果是,则返回 true。

-w file 检测文件是否可写,如果是,则返回 true。

-x file 检测文件是否可执行,如果是,则返回 true。

-s file 检测文件是否为空(文件大小是否大于0),不为空返回 true。

-e file 检测文件(包括目录)是否存在,如果是,则返回 true。

 

以上是关于Linux bash/sh/shell编程中的if语句应该怎么写的主要内容,如果未能解决你的问题,请参考以下文章

在linux下安装installer.sh 但是bash: /mnt/LoadRunner/Linux/installer.sh: 权限不够 pwd显示是root权限

linux的shell编程中#!/bin/sh和bash是啥意思?

Linux bash/sh/shell编程中的if语句应该怎么写

为啥linux 的 source命令在linux的脚本中没有作用 我使用了#!/bin/sh以及#!/bin/bash 都不好用

linux的shell编程中#!/bin/sh和$bash是啥意思?

linux定时任务shell脚本开头如下 cd ~ . .bash_profile 定时任务执行后提示找不到.bash_profile啥情况