Linux中shell的学习(printf命令、test命令、流程控制)

学习目标:

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中的数字
游戏结束!
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值