两个比较好的博客还没有看:

https://www.jianshu.com/p/dfa7e06c0308

https://blog.csdn.net/weixin_38175489/article/details/80973865

[TOC]

数字比较运算

1
2
3
4
5
6
7
8
9
10
-eq     等于,如:if ["$a" -eq "$b" ]
-ne 不等于,如:if ["$a" -ne "$b" ]
-gt 大于,如:if ["$a" -gt "$b" ]
-ge 大于等于,如:if ["$a" -ge "$b" ]
-lt 小于,如:if ["$a" -lt "$b" ]
-le 小于等于,如:if ["$a" -le "$b" ]
< 小于(需要双括号),如:(("$a" < "$b"))
<= 小于等于(需要双括号),如:(("$a" <= "$b"))
> 大于(需要双括号),如:(("$a" > "$b"))
>= 大于等于(需要双括号),如:(("$a" >= "$b"))

实例

1
2
3
4
5
6
7
8
9
if [ "$num" -gt "150" ];then
echo "$num is biger than 150"
fi
###################
if [ "$var1" = "$var2" ]; then
  echo '$var1 eq $var2'
else
  echo '$var1 not eq $var2'
fi

字符串比较

1
2
3
4
5
str1 = str2      当两个串有相同内容、长度时为真 
str1 != str2      当串str1和str2不等时为真
-n str1        当串的长度大于0时为真(串非空)
-z str1        当串的长度为0时为真(空串)
str1         当串str1为非空时为真

文件判断

1
2
3
4
5
6
7
8
9
10
文件的判断
-r file     用户可读为真
-w file     用户可写为真
-x file     用户可执行为真
-f file     文件为正规文件为真
-d file     文件为目录为真
-c file     文件为字符特殊文件为真
-b file     文件为块特殊文件为真
-s file     文件大小非0时为真
-t file     当文件描述符(默认为1)指定的设备为终端时为真

实例

1
2
3
4
5
6
7
8
9
if [ -f file ] 
then
echo "yes yes yes"
elif [ -z file ]
then
echo "yes yes"
else
echo "nonono"
fi

复杂逻辑判断

1
2
3
4
复杂逻辑判断
-a         与
-o        或
!        非

实例

1
2
3
(( a > b )) || (( a < c ))
[[ $a > $b ]] || [[ $a < $c ]]
[ $a -gt $b -o $a -lt $c ]

读取用户输入

1
2
3
#!/bin/bash
read -p "Please Enter You Name: " NAME
echo "Your Name Is: $NAME"

for 循环

1
2
3
4
5
6
#!/bin/bash
COLORS="red green blue"
for COLOR in $COLORS
do
echo "The Color is: ${COLOR}"
done

在当前所有txt文件前面追加new实现重命名

1
2
3
4
5
6
7
8
#!/bin/bash
FILES=$(ls *txt)
NEW="new"
for FILE in $FILES
do
echo "Renaming $FILE to new-$FILE"
mv $FILE $NEW-$FILE
done

while 循环

当所给的条件为true时,循环执行while里面的代码块

1
2
3
4
5
6
7
8
9
while [ CONNDITION_IS_TRUE ]
do
# Commands will change he entry condition
command 1
command 2
...
...
command N
done

实例

1
2
3
4
5
6
7
8
#!/bin/bash
LINE=1
while read CURRENT_LINE
do
echo "${LINE}: $CURRENT_LINE"
((LINE++))
done < /etc/passwd
# This script loops through the file /etc/passwd line by line

注意
continue 用于结束本次循环
break 用于结束整个循环

参数传递

当我们运行脚本的时候,可以传递参数供脚本内部使用$ ./script.sh param1 param2 param3 param4 这些参数将被存储在特殊的变量中

1
2
3
4
5
6
$0 -- "script.sh"
$1 -- "param1"
$2 -- "param2"
$3 -- "param3"
$4 -- "param4"
$@ -- array of all positional parameters

这些变量可以在脚本中的任何地方使用,就像其他全局变量一样

通配符

使用通配符可以完成特定的匹配 一些常用的通配符
* 可以通配一个或多个任意字符

1
2
3
*.txt
hello.*
great*.md

?匹配一个字符

1
2
?.md
Hello?

[]匹配括号内部的任意一个字符

1
He[loym], [AIEOU]

[!]不匹配括号内的任何字符

1
`[!aeiou]`

预先定义的通配符

  • [[:alpha:]]
  • [[:alnum:]]
  • [[:space:]]
  • [[:upper:]]]
  • [[:lower:]]
  • [[:digit:]]

匹配通配符 有些情况下我们想匹配*?等特殊字符,可以使用转义字符 \* \?

数组的定义及遍历

1
2
3
4
5
6
7
8
9
10
array=(element1 element2 element3 .... elementN)
#单独取某个元素
echo ${array[0]}
echo ${array[index]}
# 取数组的全部
# ${array[@]}
for data in ${array[@]}
do
echo ${data}
done

参考:
https://www.jianshu.com/p/5568d311fb5a

https://blog.csdn.net/nodeman/article/details/48293185