盒子
盒子
文章目录
  1. 1. 数学运算相关命令
  2. 2. 条件语句 if
    1. 2.1 例一
    2. 2.2 例二
    3. 2.3 例三
  3. 3. test 命令
    1. 3.1 数值比较(注意空格)
      1. 3.1.1 例一
      2. 3.1.2 例二
      3. 3.1.3 例三
    2. 3.2 字符串比较(注意空格)
      1. 3.2.1 例一
      2. 3.2.2 例二
      3. 3.2.3 例三
    3. 3.3 文件比较
      1. 3.3.1 例一
      2. 3.3.2 例二
  4. 4. 复合条件测试
  5. 5. if-then 语句的高级特性
  6. 7. case 命令
  7. 8. 循环语句 for
    1. 8.1 例一
    2. 8.2 例二
    3. 8.3 例三
    4. 8.4 例四
    5. 8.5 例五
    6. 8.6 例六
    7. 8.7 嵌套循环
    8. 8.8 特殊的环境变量 IFS
  8. 9. while 命令
    1. 9.1 例一
    2. 9.2 例二
  9. 10. until 命令
  10. 11. break 和 continue
    1. 11.1 例一
    2. 11.2 例二
    3. 11.3 例三
    4. 11.4 例四
    5. 11.5 例五
    6. 11.6 例六

Linux shell 脚本

1. 数学运算相关命令

expr 用来处理数学表达式,它可以识别一些不同的数学和字符串操作符(注意操作符两侧的空格和转义)
图片1.png
图片2.png

1
2
3
4
[root@master01 ~]# expr 1 + 5
6
[root@master01 ~]# expr 5 \* 2
10

在 shell 脚本中使用 expr 命令:

1
2
3
4
5
#! /bin/bash
a=3
b=4
c=`expr $a \* $b`
echo $c
1
2
[root@master01 hdfsData]# ./test 
12

shell 提供一个执行数学表达式更简单的方法,$[operation] 你可以用美元符号和方括号将数学表达式圈起来(注意不需要转义)

1
2
3
4
5
#! /bin/bash
a=3
b=4
d=$[a+b]
echo $d
1
2
[root@master01 hdfsData]# ./test 
7

2. 条件语句 if

Bash shell 的 if 语句会运行 if 行定义的那个命令。如果该命令退出状态码是0(该命令成功运行),位于 then 部分的命令就会执行。

2.1 例一

1
2
3
4
5
6
#! /bin/bash
if date
then
# 语句块
echo '进入if语句了'
fi
1
2
3
[root@master01 scripts]# ./if_demo1 
Thu Sep 26 17:11:04 CST 2019
进入if语句了

2.2 例二

1
2
3
4
5
6
7
8
9
10
#! /bin/bash
if aaa # 返回非0状态码
then
echo '进入aaa代码段了'
fi

if date
then
echo '进入date代码段了'
fi
1
2
3
4
[root@master01 scripts]# ./if_demo2
./if_demo2: line 2: aaa: command not found
Thu Sep 26 17:32:05 CST 2019
进入date代码段了

2.3 例三

加入else 分支

1
2
3
4
5
6
7
#! /bin/bash
if aaa
then
echo '我在aaa代码块'
else # 加入else分支,非0状态码执行该语句块
echo '我在else分支'
fi
1
2
3
[root@master01 scripts]# ./if_demo3
./if_demo3: line 2: aaa: command not found
我在else分支

嵌套多条件的 if then 语句

1
2
3
4
5
6
7
8
9
10
#! /bin/bash
if aaa
then
echo '我在aaa代码块'
elif date
then
echo '我在date代码块'
else
echo '我在else代码块'
fi
1
2
3
4
[root@master01 scripts]# ./if_demo4
./if_demo4: line 2: aaa: command not found
Thu Sep 26 18:45:31 CST 2019
我在date代码块

3. test 命令

格式1:test condition
格式2:[ condition ] 必须在左括号和右括号左侧各加一个空格,否则会报错。

test 命令可以判断3类条件:
数值比较
字符串比较
文件比较

3.1 数值比较(注意空格)

图片3.png

3.1.1 例一

1
2
3
4
5
6
#! /bin/bash
# 数值条件
if [ 6 -gt 3 ]
then
echo "6 大于 3"
fi
1
2
[root@master01 scripts]# ./test_demo1 
6 大于 3

3.1.2 例二

1
2
3
4
5
6
7
8
a=10
b=11
if [ $a -eq $b ]
then
echo "a 等于 b"
else
echo "a 不等于 b"
fi
1
2
[root@master01 scripts]# ./test_demo1 
a 不等于 b

3.1.3 例三

1
2
3
4
5
a=33.3  # bash shell 只能处理整数
if [ $a -gt 20 ]
then
echo "a 大于 20"
fi
1
2
[root@master01 scripts]# ./test_demo1 
./test_demo1: line 18: [: 33.3: integer expression expected

3.2 字符串比较(注意空格)

图片4.png
注意

  • test 的比较会将所有的标点和大写也考虑在内。
  • 要转义大于小于号,否则会被当做重定向符号。
  • test 命令字符串比较会使用标准的 ASCII 顺序,根据每个字符的 ASCII 数值来决定排序顺序。
  • test 命令使用标准的数学比较符号来表示字符串的比较,而用文本代码表示数值比较。

3.2.1 例一

1
2
3
4
5
6
#! /bin/bash
# 字符串比较
if [ aa = aa ]
then
echo "字符串相等"
fi
1
2
[root@master01 scripts]# ./test_demo2
字符串相等

3.2.2 例二

1
2
3
4
5
6
7
8
username=miracle
testuser=miracle
if [ $testuser = $username ]
then
echo "Welcome $testuser!"
else
echo "Incorrect username!"
fi
1
2
[root@master01 scripts]# ./test_demo2
Welcome miracle!

3.2.3 例三

1
2
3
4
5
6
7
8
a=a
b=b
if [ $a \> $b ]
then
echo "$a 的ASCII值大于 $b"
else
echo "$a 的ASCII值小于 $b"
fi
1
2
[root@master01 scripts]# ./test_demo2
a 的ASCII值小于 b

3.3 文件比较

图片5.png

3.3.1 例一

1
2
3
4
5
6
7
8
9
10
11
#! /bin/bash
if [ -d $HOME ]
then
ls $HOME
if [ -r $HOME ]
then
echo "$HOME 可读"
fi
else
echo "$HOME 不存在"
fi
1
2
3
4
5
[root@master01 scripts]# ./test_demo3
anaconda-ks.cfg Downloads Pictures root@slave01 Templates
Desktop initial-setup-ks.cfg Public root@slave02 Videos
Documents Music root@master02 root@slave03 zookeeper.out
/root 可读

3.3.2 例二

1
2
3
4
5
6
if [ test_demo3 -nt test_demo2 ]
then
echo "test_demo3 is newer than test_demo2"
else
echo "test_demo3 is older than test_demo2"
fi
1
2
[root@master01 scripts]# ./test_demo3
test_demo3 is newer than test_demo2

4. 复合条件测试

1
2
3
4
5
6
7
8
9
10
#! /bin/bash
if date && [ -n aaa ]
then
echo "first run"
fi

if [ 2 -gt 3 ] || [ -f $HOME ]
then
echo "second run"
fi
1
2
3
[root@master01 scripts]# ./test_demo4
Fri Sep 27 16:19:51 CST 2019
first run

5. if-then 语句的高级特性

  • 用于数学表达式的双括号
  • 用于高级字符串处理功能的双方括号。

(( )) 双括号命令允许你将高级数学表达式放入比较中,test 命令只允许在比较中进行简单的算数操作。
图片6.png
注意

  • 双括号两侧的空格可以省略
  • 不需要将双括号中表达式里的大于小于号转义。

[[ ]] 双方括号支持 test 命令的特性,并新增了另一个特性模式(正则表达式)匹配。
注意:双方括号两侧的空格必须存在,否则报错。

1
2
3
4
5
6
7
8
9
10
11
#! /bin/bash
if ((10 ** 2 > 90))
then
((v2=10**2))
echo "v2 = $v2"
fi

if [[ $USER = root ]]
then
echo "yes"
fi
1
2
3
[root@master01 scripts]# ./test_demo5
v2 = 100
yes

7. case 命令

为了避免在一组可能的值中寻找特定值而写出很长的 if-then-else 语句,引入 case 命令。
case 命令会检查单个变量列表格式的多个值。
通过竖线操作符来分割模式

  • 会捕获所有跟列出的模式都不匹配的值。
1
2
3
4
5
6
7
8
9
#! /bin/bash
case $USER in
root)
echo "Welcome root";;
miracle)
echo "Welcome miracle";;
*)
echo "Welcome other";;
esac
1
2
[root@master01 scripts]# ./case_demo1 
Welcome root

8. 循环语句 for

8.1 例一

元素按照空格切分

1
2
3
4
5
6
7
#! /bin/bash
for c in China USA UK Japan
do
echo "The next country is $c"
done

echo $c # 循环最后一次赋值可以继续使用
1
2
3
4
5
6
[root@master01 scripts]# ./for_demo1 
The next country is China
The next country is USA
The next country is UK
The next country is Japan
Japan

8.2 例二

  • 单引号需要转义
  • 元素如果带空格,使用引号括起来
    1
    2
    3
    4
    5
    #! /bin/bash
    for test in I\'m a boy, "you are a girl"
    do
    echo "The next is $test"
    done
1
2
3
4
5
[root@master01 scripts]# ./for_demo2
The next is I'm
The next is a
The next is boy,
The next is you are a girl

8.3 例三

从变量读取迭代列表

1
2
3
4
5
6
#! /bin/bash
countries="China USA UK Japan"
for c in $countries
do
echo "The next is $c"
done
1
2
3
4
5
[root@master01 scripts]# ./for_demo3
The next is China
The next is USA
The next is UK
The next is Japan

8.4 例四

从文件读取迭代列表

1
2
3
4
5
#! /bin/bash
for c in `cat countries`
do
echo "The next is $c"
done
1
2
3
4
5
[root@master01 scripts]# ./for_demo4
The next is 中国
The next is 美国
The next is 英国
The next is 日本

8.5 例五

C 语言风格的 for 循环

1
2
3
4
5
#! /bin/bash
for ((i=0; i<5; i++))
do
echo $i
done
1
2
3
4
5
6
[root@master01 scripts]# ./for_demo5
0
1
2
3
4

8.6 例六

C 语言风格的多个条件

1
2
3
4
5
#! /bin/bash
for ((a=1,b=10;a<=10,b>2;a++,b--))
do
echo "$a - $b"
done
1
2
3
4
5
6
7
8
9
[root@master01 scripts]# ./for_demo6
1 - 10
2 - 9
3 - 8
4 - 7
5 - 6
6 - 5
7 - 4
8 - 3

8.7 嵌套循环

1
2
3
4
5
6
7
8
9
#! /bin/bash
for (( a=1; a<=3; a++ ))
do
echo "start loop $a"
for (( b=1; b <=3; b++ ))
do
echo "inside loop $b"
done
done
1
2
3
4
5
6
7
8
9
10
11
12
13
[root@master01 scripts]# ./for_demo7
start loop 1
inside loop 1
inside loop 2
inside loop 3
start loop 2
inside loop 1
inside loop 2
inside loop 3
start loop 3
inside loop 1
inside loop 2
inside loop 3

8.8 特殊的环境变量 IFS

IFS,称为内部字段分隔符(Interal Field Separator),IFS 环境变量定义了 bash shell 用作字段分隔符的一系列字符。

1
2
3
4
5
6
7
[root@master01 scripts]# set | grep IFS
IFS=$' \t\n'
local option option2 i IFS='
IFS='
local IFS='
local IFS='
...

默认情况下,bash shell 会将空格、制表符、换行符定义为字段分隔符。

9. while 命令

允许你在 while 语句行定义多个测试命令,只有最后一个测试命令的退出状态码会被用来决定什么时候结束循环。

9.1 例一

1
2
3
4
5
6
7
#! /bin/bash
a=10
while [ $a -gt 0 ]
do
echo $a
(( a-- ))
done
1
2
3
4
5
6
7
8
9
10
11
[root@master01 scripts]# ./while_demo1 
10
9
8
7
6
5
4
3
2
1

9.2 例二

定义多个测试命令,只有最后一个测试命令的退出状态码会被用来决定结束循环。

1
2
3
4
5
6
7
8
#! /bin/bash
a=10
while echo $a
[ $a -gt 0 ]
do
echo "This is flag"
(( a-- ))
done
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
[root@master01 scripts]# ./while_demo2
10
This is flag
9
This is flag
8
This is flag
7
This is flag
6
This is flag
5
This is flag
4
This is flag
3
This is flag
2
This is flag
1
This is flag
0

10. until 命令

until 命令和 while 命令工作的方式完全相反,until 命令要求你指定一个通常输出非零退出状态码的测试命令,一旦测试命令返回退出状态码 0 ,则循环就结束了。

1
2
3
4
5
6
7
#! /bin/bash
a=10
until [ $a -eq 0 ] # 指定非 0 状态码的条件
do
echo $a
(( a-- ))
done
1
2
3
4
5
6
7
8
9
10
11
[root@master01 scripts]# ./until_demo1 
10
9
8
7
6
5
4
3
2
1

11. break 和 continue

11.1 例一

1
2
3
4
5
6
7
8
9
#! /bin/bash
for a in 1 2 3 4 5 6 7
do
if [ $a -eq 5 ]
then
break # 跳出循环
fi
echo $a
done
1
2
3
4
5
[root@master01 scripts]# ./break_demo1 
1
2
3
4

11.2 例二

1
2
3
4
5
6
7
8
9
10
11
#! /bin/bash
a=10
while [ $a -gt 0 ]
do
if [ $a -eq 5 ]
then
break
fi
echo $a
(( a-- ))
done
1
2
3
4
5
6
[root@master01 scripts]# ./break_demo2
10
9
8
7
6

11.3 例三

1
2
3
4
5
6
7
8
9
10
11
12
13
#! /bin/bash
for ((a=1; a<4; a++))
do
echo "Outer loop: $a"
for ((b=1; b<100; b++))
do
if [ $b -eq 5 ]
then
break # 默认跳出最靠近的循环
fi
echo "Inner loop: $b"
done
done
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[root@master01 scripts]# ./break_demo3
Outer loop: 1
Inner loop: 1
Inner loop: 2
Inner loop: 3
Inner loop: 4
Outer loop: 2
Inner loop: 1
Inner loop: 2
Inner loop: 3
Inner loop: 4
Outer loop: 3
Inner loop: 1
Inner loop: 2
Inner loop: 3
Inner loop: 4

11.4 例四

break 指定跳出层级

1
2
3
4
5
6
7
8
9
10
11
12
13
#! /bin/bash
for ((a=1; a<4; a++))
do
echo "Outer loop: $a"
for ((b=1; b<100; b++))
do
if [ $b -eq 5 ]
then
break 2 # 指明 break 要跳出的层级,若不指明,默认层级为1
fi
echo "Inner loop: $b"
done
done
1
2
3
4
5
6
[root@master01 scripts]# ./break_demo3
Outer loop: 1
Inner loop: 1
Inner loop: 2
Inner loop: 3
Inner loop: 4

11.5 例五

1
2
3
4
5
6
7
8
9
#! /bin/bash
for ((a=1; a<15; a++))
do
if [ $a -gt 5 ] && [ $a -lt 10 ]
then
continue # 跳过本次循环
fi
echo "Iteration number: $a"
done
1
2
3
4
5
6
7
8
9
10
11
[root@master01 scripts]# ./continue_demo1 
Iteration number: 1
Iteration number: 2
Iteration number: 3
Iteration number: 4
Iteration number: 5
Iteration number: 10
Iteration number: 11
Iteration number: 12
Iteration number: 13
Iteration number: 14

11.6 例六

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#! /bin/bash
for ((a=1; a<=5; a++))
do
echo "Iteration $a"
for ((b=1; b<3; b++))
do
echo "b= $b"
if [ $a -gt 2 ] && [ $a -lt 4 ]
then
continue 2 # 指明要继续的循环层级
fi
c=$[a*b]
echo "The result of $a * $b is $c"
done
done
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
[root@master01 scripts]# ./continue_demo2
Iteration 1
b= 1
The result of 1 * 1 is 1
b= 2
The result of 1 * 2 is 2
Iteration 2
b= 1
The result of 2 * 1 is 2
b= 2
The result of 2 * 2 is 4
Iteration 3
b= 1
Iteration 4
b= 1
The result of 4 * 1 is 4
b= 2
The result of 4 * 2 is 8
Iteration 5
b= 1
The result of 5 * 1 is 5
b= 2
The result of 5 * 2 is 10
支持一下
扫一扫,支持forsigner
  • 微信扫一扫
  • 支付宝扫一扫