学习目标:
Linux速成九、
学习内容:
1、printf命令
2、test命令
3、流程控制
1、printf命令
%d输出长整形格式
%s 字符串
%c 单个字符
- printf 使用引用文本或空格分隔的参数,可以在 printf 中使用格式化字符串,还可以制定字符串的宽度、左右对齐方式等,默认printf 不会自动添加换行符,需要手动添加 \n
- 直接输出:
$ echo "Hello, Shell"
Hello, Shell
$ printf "Hello, Shell\n"
Hello, Shell
- printf 中使用格式化字符串,还可以制定字符串的宽度、左右对齐方式
%s %c %d %f都是格式替代符 %-10s :指一个宽度为 10 个字符(-表示左对齐,没有则表示右对齐),任何字符都会被显示在 10个字符宽的字符内,如果不足则自动以空格填充,超过也会将内容全部显示出来
%-4.2f :指格式化为小数,其中 .2 指保留 2 位小数
实例:
#!/bin/bash
printf "%-10s %-8s %-4s\n" 姓名 性别 体重
printf "%-10s %-8s %-4.2f\n" 张三 男 65
printf "%-10s %-8s %-4.2f\n" 李四 男 62.23
printf "%-10s %-8s %-4.2f\n" 王五 男 56.123
printf "%-10s %-8s %-4.2f\n" 杨花 女 46.32
[root@localhost project]# sed -i 's/\r$//' test.sh
[root@localhost project]# ./test.sh
姓名 性别 体重
张三 男 65.00
李四 男 62.23
王五 男 56.12
杨花 女 46.32
1、例题:各种输出
#!/bin/bash
printf "%-s %-d" abcd 100
printf '%-s %-d' abcd 100
printf %-s abcd
printf "%-s %-s" abcd efgh ijkl
printf "%-s\n" abcd efgh
printf "%-s and %d\n"
[root@localhost project]# ./test.sh
abcd 100abcd 100abcdabcd efghijkl abcd
efgh
and 0
- printf转义序列:
\f:换页(formfeed)
\n:换行
\r:回车(Carriage return)
\t:水平制表符
\v:垂直制表符
\:一个字面上的反斜杠字符
\ddd :表示 1 到 3 位数八进制值的字符,仅在格式字符串中有效
\0ddd:表示 1 到 3位的八进制值字符
2、test命令
- 数值测试
实例:
#!/bin/bash
num1=100
num2=100
if test $[num1] -eq $[num2]
then
echo '两个数相等!'
else
echo '两个数不相等!'
fi
[root@localhost project]# ./test.sh
两个数不相等!
- 字符串测试
-z 字符串 字符串长度为零则为真
-n 字符串 字符串长度不为零则为真
实例:
#!/bin/bash
str1=abcdef
str2=
if test -z $str1
then
echo "字符串为空!"
else "字符串不为空 "
fi
[root@
localhost project]# ./test.sh
字符串不为空
- 文件测试
-e :文件名 如果文件存在则为真
-s :文件名 如果文件存在且至少有一个字符则为真
-f :文件名 如果文件存在且为普通文件则为真
#!/bin/bash
cd /myshell/project
if test -e ./game1.sh
then
echo '文件已存在!'
else
echo "文件不存在!"
fi
[root@localhost project]# sed -i 's/\r$//' test.sh
[root@localhost project]# ./test.sh
文件已存在!
[root@localhost project]# pwd
/myshell/project
[root@localhost project]# ls -l
总用量 12
-rwx------. 1 root root 451 11月 6 22:42 game1.sh
-rwx------. 1 root root 488 11月 6 21:19 game2.sh
-rwx------. 1 root root 122 11月 7 03:01 test.sh
3、流程控制
1、if语句
- if […]
then
echo …
fi
实例:ps -ef表示查看全格式的全部进程,grep -c 文件中关键字的个数
#!/bin/bash
if [ $(ps -ef | grep -c "ssh") -gt 1 ]
then
echo "ture"
fi
[root@localhost project]# ./test.sh
ture
- if[…]
then
echo…
else
echo…
fi
实例:进行a与b大小的比较
#!/bin/bash
a=100
b=200
if [ $a -eq $b ]
then
echo "a等于b"
else
echo "a不等于b"
fi
[root@localhost project]# sed -i 's/\r$//' test.sh
[root@localhost project]# ./test.sh
a不等于b
- if […]
then
echo …
elif […]
then
echo…
else
echo …
fi
实例:a和b进行大小比较,当为真时执行相应的运算
#!/bin/bash
a=100
b=200
if [ $a -gt $b ]
then
echo "a加b等于:`expr $a + $b ` "
elif [ $b -lt $a ]
then
echo "b加减a等于:`expr $b - $a ` "
else [ $a -le $b ]
echo "a乘b等于:`expr $a \* $b ` "
fi
[root@localhost project]# sed -i 's/\r$//' test.sh
[root@localhost project]# ./test.sh
a乘b等于:20000
2、for语句
- for var in item1 item2 … itemN
do
command1
command2
…
commandN
done
或者
for var in item1 item2 … itemN; do command1; command2… done;
实例:
当变量值在列表里,for循环即执行一次所有命令,使用变量名获取列表中的当前取值,命令可为任何有效的shell命令和语句,in列表可以包含替换、字符串和文件名
#!/bin/bash
for str in 'i am a good man'
do
echo $str
done
[root@localhost project]# sed -i 's/\r$//' test.sh
[root@localhost project]# ./test.sh
i am a good man
3、while语句
- while condition
do
command
done
实例:
#!/bin/bash
int=1
while(( $int <= 5 ))
do
echo $int
let "int++"
done
[root@bogon project]# ./test.sh
1
2
3
4
5
#!/bin/bash
echo '请输入你最喜欢的演员:'
while read actor
do
echo "$actor是你最喜欢的演员!"
break
done
[root@bogon project]# ./test.sh
请输入你最喜欢的演员:
彭于晏
彭于晏是你最喜欢的演员!
4、无限循环
- while : do
command
done
或者 - while true
do
command
done
或者 - for (( ; ; ))
实例:
#!/bin/bash
echo '按下<Ctrl-c>退出'
echo -n '游戏开始!请一号玩家输入一个数:'
read num1
while :
do
echo '请二号玩家输入一个数进行猜谜:'
read num2
if [ $num2 -gt $num1 ]
then
echo "二号玩家输入较大"
elif [ $num2 -lt $num1 ]
then
echo "二号玩家输入较小"
elif [ $num2 -eq $num1 ]
then
echo "恭喜你!!!答对啦"
break
fi
done
[root@bogon project]# ./game1.sh
按下<Ctrl-c>退出
游戏开始!请一号玩家输入一个数:5
请二号玩家输入一个数进行猜谜:
4
二号玩家输入较小
请二号玩家输入一个数进行猜谜:
6
二号玩家输入较大
请二号玩家输入一个数进行猜谜:
5
恭喜你!!!答对啦
5、until 循环语句
- until循环执行一系列命令直至条件为真时停止,until循环与while循环在处理方式上刚好相反,一般while循环优于until循环,但在某些时候—也只是极少数情况下,until循环更加有用,until运行时,会在条件不满足时,直接先进行until体内的do运算,当条件为真时会停止整个循环的运行
- until condition
do
command
done
实例:
#!/bin/bash
int=1
until [ $int -eq 10 ]
do
while [ $int -lt 10 ]
do
echo "no"
let "int++"
done
echo "yes"
done
[root@bogon project]# ./test.sh
no
no
no
no
no
no
no
no
no
yes
6、case语句
- Shell case语句为多选择语句,每一模式必须以右括号结束,所有命令开始执行直至 ;;,如果无一匹配模式,使用星号 * 捕获该值,再执行后面的命令
- case 值 in
模式1)
command1
command2
…
commandN
;;
模式2)
command1
command2
…
commandN
;;
esac
实例:
#!/bin/bash
echo '请选择模式(1-4):'
read num
echo "你输入的是数字:$num "
case $num in
1) echo '你选择了模式 1'
;;
2) echo '你选择了模式 2'
;;
3) echo '你选择了模式 3'
;;
4) echo '你选择了模式 4'
;;
*) echo '你没有输入 1 到 4 之间的数字'
;;
esac
[root@bogon project]# ./test.sh
请选择模式(1-4):
2
你输入的是数字:2
你选择了模式 2
7、跳出循环语句
- break命令允许跳出所有循环(终止执行后面的所有循环)
实例:
#!/bin/bash
while :
do
echo '请输入1-5中任意一个数字:'
read num
case $num in
1|2|3|4|5) echo "你输入的是:$num "
;;
*) echo "你输入的不是1-5中的数字"
break
;;
esac
done
[root@bogon project]# ./test.sh
请输入1-5中任意一个数字:
5
你输入的是:5
请输入1-5中任意一个数字:
3
你输入的是:3
请输入1-5中任意一个数字:
你输入的不是1-5中的数字
- continue命令与break命令类似,只有一点差别,它不会跳出所有循环,仅仅跳出当前循环
实例:
#!/bin/bash
num=1
until [ $num -gt 5 ]
do
while (( $num<=5 ))
do
echo '请输入1-5中任意一个数字:'
read num
case $num in
1|2|3|4|5) echo "你输入的是:$num "
;;
*) echo "你输入的不是1-5中的数字"
continue
;;
esac
done
echo "游戏结束!"
break
done
[root@bogon project]# ./test.sh
请输入1-5中任意一个数字:
1
你输入的是:1
请输入1-5中任意一个数字:
2
你输入的是:2
请输入1-5中任意一个数字:
3
你输入的是:3
请输入1-5中任意一个数字:
4
你输入的是:4
请输入1-5中任意一个数字:
5
你输入的是:5
请输入1-5中任意一个数字:
10
你输入的不是1-5中的数字
游戏结束!