shell编程流程控制语句 if for while until用法

# 当在一行上有多个操作时,需要用命令分割符 分号 ; 隔开,比如 echo a; echo b
# 分号是用来隔断每个语法关键字或命令

# if 用法

#!/bin/bash
if [ 1 = 1 ] # 注意空格不能少,少了就报错 1=1是赋值 1 = 1 是比较 而且中括号跟表达式之间也有空格,少了也报错
then
 echo true
else
 echo false
fi

# 也可以这样表示

#!/bin/bash
if [ 1 = 1 ]; then
 echo true; echo correct
else
 echo false; echo incorrect
fi

# 也可以全部扔到一行上 风格太丑,不用

#!/bin/bash
if [ 1 = 1 ]; then echo true; echo correct; else echo false; echo incorrect; fi

其实[] 就是test 命令的简写方式

# for循环需要两层括号

#!/bin/bash
for((i=1;i<=10;i++))
do
 echo $i
done

# 或者这样 do放到一行上

#!/bin/bash
for((i=1;i<=10;i++)); do
 echo $i
done

# for in 用法

#!/bin/bash
for i in 'ab bbb' b c; do # 不需要括号包起来,不需要逗号隔开,用空格分隔 带空格的字符串用单/双引号引起来
 echo $i
done

# while 用法

#!/bin/bash
i=10
while [[ $i -gt 5 ]]; do # [[]] 是正确判断条件写法 上面提到过[]是test的简写
 echo $i
 ((i--))
done

# until 用法
# 意思是当条件满足就退出,否则就执行语句, 感觉比较另类

#!/bin/bash
i=10
until [[ i -lt 0 ]]; do
 echo $i
 ((i--))
done

# case 用法

#!/bin/bash
read i

case $i in
 a)
 echo it is a
 ;;

 b)
 echo it is b
 ;;

 c)
 echo it is c
 ;;

 d|e)
 echo it is d or e
 ;;

 [fgh])
 echo it is f or g or h
 ;;

 [i-l])
 echo it is i-l
 ;;

 ?)
 echo it is single unit
 ;;

 *)
 echo other
esac

# * 任意字串, ? 任意单个字符, [abc] a, b, 或c三字元其中之一, [a-n] 从a到n的任一字元 ,| 多重选择 或者的意思

# select 用法
# select 一般和case配合使用,会出现一个菜单,提示选择前面的数字,而且如果没有退出的话,会继续提示选择,如图。

#!/bin/bash
select i in a b c
do
case $i in
 a)
 echo aaa
 exit
 ;;

 b)
 echo bbb
 ;;

 c)
 echo ccc
 ;;

 *)
 echo other
 ;;
esac
done

评论关闭

关于shell中read命令接收多个参数

比如需求为:用 read 接收输入的两个参数,做为用户名和密码,用一句实现。

实现方法:

#!/bin/bash
stty erase ^h
read -p "请输入用户名密码,空格隔开: " username password
echo $username
echo $password

运行结果:

 

 

 

把第一个输入赋值给 username 变量,空格后面的输入赋值给 password 变量。

如果在输入内容时,输入错误,用退格键删除时,会显示^H,删不掉错误的内容,如图:

 

 

解决方法就是在脚本顶部上加
stty erase ^h  这行代码(上面脚本已经加了,演示图中的脚本没加),就可以实现退格删除,另一种方法就是按着 ctrl+退格 删除。

评论关闭

sed替换、添加行


# 源文件
[root@localhost ~]# cat 111
that's venus file
dont edit it
by venus

# 替换字符串
[root@localhost ~]# sed -i 's/venus/simon/' 111
[root@localhost ~]# cat 111
that's simon file
dont edit it
by simon
可以看到venus都被替换为simon

# 字符串中包含单引号的替换
[root@localhost ~]# cat 111
that's simon file
dont edit it
by simon

sed中的单引号需要换成双引号
[root@localhost ~]# sed -i "s/that's/aaa/" 111
[root@localhost ~]# cat 111
aaa simon file
dont edit it
by simon

# 字符串中包含双引号的替换
[root@localhost ~]# cat 111
that"s simon file
dont edit it
by simon

[root@localhost ~]# sed -i 's/that"s/aaa/' 111
[root@localhost ~]# cat 111
aaa simon file
dont edit it
by simon

# 对于带$符号的替换
[root@localhost ~]# cat 111
name=venus
that's $name file
dont edit it
by simon

[root@localhost ~]# sed -i 's/$name/aaa/' 111
[root@localhost ~]# cat 111
name=venus
that's aaa file
dont edit it
by simon
不需要转义

# 插入 行下面
[root@localhost ~]# cat 111
a
b
c
在a下面插入eee字符串
[root@localhost ~]# sed -i '/a/a\eee' 111
[root@localhost ~]# cat 111
a
eee
b
c

# 在a上面插入fff字符串
[root@localhost ~]# cat 111
a
eee
b
c
abc
eee

[root@localhost ~]# sed -i '/a/i\fff' 111
[root@localhost ~]# cat 111
fff
a
eee
b
c
fff
abc
eee

# 插入有特殊字符的
[root@localhost ~]# cat 111
a
b
c
[root@localhost ~]# sed -i '/a/a\hello world \\' 111
[root@localhost ~]# cat 111
a
hello world \
b
c
就需要转义特殊字符

# 插入带换行的字符串
[root@localhost ~]# cat 111
a
b
c
[root@localhost ~]# sed -i '/b/a\hello world \\\nhello world2' 111
[root@localhost ~]# cat 111
a
b
hello world \
hello world2
c
通过\n来换行
评论关闭