浅尝shell

Shell

运算符

数字运算符

原生bash不支持简单的数学运算,但是可以通过其他命令来实现,例如 awk 和 expr,expr 最常用。

算数运算符

# 算数运算符
# + 加法
val=`expr 2 + 2`
echo "两数之和为: $val"

# - 减法
val=`expr 4 - 2`
echo "两数之差为: $val"

# * 乘法
val=`expr 2 \* 2`
echo "两数之积为: $val"
#! tip: 乘号(*)前边必须加反斜杠(\)才能实现乘法运算

# / 除法
val=`expr 4 / 2`
echo "两数之商为:$val"

# % 取余
val=`expr 8 % 3`
echo "8 对 3 取余数得:$val"

# = 赋值
var=2
echo "val的值为: $val"

# todo 下方用于判断
# == 判断是否相等
var1=2
var2=4
if [ $a == $b ]
then 
	echo "a 等于 b"
else
	echo "a 不等于 b"
fi

# != 判断是否不相等
var1=2
var2=4
if [ $a != $b ]
then 
	echo "a 不等于 b"
else
	echo "a 等于 b"
fi

# 关系运算符
-gt === a>b  a是否大于b a>b? 大于返回true
-lt === a<b  a是否小于b a<b? 小于返回true
-ge === a>=b a是否大于等于b a>=b? 是返回true
-le === a<=b a是否小于等于b a<=b? 是返回true
-eq === 相等(比较两个数字) 返回true
-ne === 不相等(比较两个数字) 返回 true

布尔运算符&逻辑运算符

# 布尔运算符
# shell 与或非运算 -a -o !
# 与运算
var1=30
var2=0
[ $var1 -a $var2 ] # 返回 false 因为0为假
var1=30
var2=31
[ $var1 -a $var2 ] # 返回true 因为两者都为真

# 或运算
var1=30
var2=0
[ $var1 -o $var2 ] # 返回true 因为两者有一个为真

# 非运算

var1=30
[ !$var1 ] # 返回false 因为 var1 为真 取非为假
var1=0
[ !$var1 ] # 返回true 因为 var1 为假  取非为真

# 逻辑运行算符
# && || 

# && 逻辑 and 
var1=1
var2=0
[[ $var1 && $var2 ]] # 返回false 
var1=1
var2=2
[[ $var1 && $var2 ]] # 返回true

# || 逻辑 or
var1=1
var2=0
[[ $var1 || $var2 ]] # 返回true
var1=0
var2=0
[[ $var1 || $var2 ]] # 返回false

字符串运算符

# = 判断两个字符是否相等 
var_1='h'
var_2='p'
[ $var_1 = $var_2 ] # 返回false

# != 判断两个字符串是否不相等
var_1='h'
var_2='p'
[ $var_1 != $var_2 ] # 返回true

# -z 判断字符串长度是否不为零
var_1=""
if [ -z "$str_A" ]; then echo '长度为零'; else echo "长度不为零";fi
# 结果为零
var_1='He'
if [ -z "$str_A" ]; then echo '长度为零'; else echo "长度不为零";fi
# 结果不为零

# -n 判断字符串长度是否不为零 与 -z相反

# $ 检测字符串是否为空 不为空则返回true

文件测试运算符

文件测试运算符用于测试Unix文件的各种属性

以下的file皆指文件路径*

例如file="/usr/local/hello.sh"

# -b file 检测文件是否是块设备文件 如果是则返回true
[ -b $file ]

# -c file 检测文件是否是字符设备文件 如果是则返回true
[ -c $file]

# -d file 检测文件是否是目录 如果是则返回true
[ -d $file]

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

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

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

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

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

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

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

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

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

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

# todo tip: 其他检查符 -S: 判断某文件是否 socket。 -L: 检测文件是否存在并且是一个符号链接。

字符串

# "" 双引号

读取字符串个数

str=”hello world“
echo "str的长度为: ${#str}"

流程控制

if

if ['判断体'] // if流程开始
then // 执行体
	echo '判断为真我被执行'
elif // 
then
	echo '可能存在多个判断条件 我符合'
else // else 不写then
	echo '我不符合条件 so被执行'
fi // 结束此次if判断

for

for str in item1 item2 item3.... itemN # 开始循环的对象
do # 循环体
	echo $str
done # 结束循环


# 以上内容可以写成一行 但要在注意格式
for str in item1 item2 item3.... itemN; do echo $str; done;

while

#! /bin/bash
int=1
while(($int<=5)) # 循环条件
do # 符合条件的循环结果
	echo $int
	let "int++"
done  # 结束循环

let用法

let arg [arg...]# 要执行的表达式

# 实例操作
no=2
# 自加操作
let 'no++' === let no+=1
# 自减操作
let 'no--' === let no-=1

上一篇:[ACTF2020 新生赛]Exec


下一篇:Pytorch学习记录(六)预训练模型的使用和修改