0
点赞
收藏
分享

微信扫一扫

Linux的Shell编程基础(下)--printf 命令/test 命令/流程控制/函数/输入与输出重定向/文件包含

目录

1、Shell printf 命令

2、Shell test 命令

3、Shell 流程控制

4、Shell 函数

5、Shell 输入/输出重定向

6、Shell 文件包含  

一、Shell printf 命令

printf和echo都是输出命令,printf 由 POSIX 标准所定义,因此使用 printf 的脚本比使用 echo 移植性好。


默认 printf 不会像 echo 自动在执行语句后添加换行符,我们可以手动添加 \n(echo "Hello, xiaohuang!" 等价于 printf "Hello, xiaohuang!\n")


printf的格式替代符%s %c %d %f    

  • %-10s  #限定宽度为10个字符的字符串,字符不够空格来补(-表示左对齐,没有则表示右对齐)
  •  %-4.2f  #限定最小宽度为4个字符的浮点数,宽度不够空格来补,小时点后面保留2位,位数不够0来补,左对齐
  •  %d     #十进制整数型数据
  •  %c      #表示输出格式为字符

[root@hadoop02 shell01]# vim Demo4.sh
#!/bin/bash
#printf的使用
printf "%-10s %-8s %-4s\n" 姓名 性别 身高m
printf "%-10s %-8s %-4.2f\n" 小王 男 1.7  
printf "%-10s %-8s %-4.2f\n" 小张 男 1.86543
printf "%-10s %-8s %-4.2f\n" 小刘 女 1.79876                                                              
~                                                                
"Demo4.sh" 6L, 222C written
#添加可执行权                    
[root@hadoop02 shell01]# chmod +x  Demo4.sh
#查看可执行权
[root@hadoop02 shell01]# ll
total 4
-rwxr-xr-x. 1 root root  222 Oct 18 06:34 Demo4.sh
#执行脚本
[root@hadoop02 shell01]# sh Demo4.sh       
姓名     性别   身高m
小王     男      1.70
小张     男      1.87
小刘     女      1.80
[root@hadoop02 shell01]#

printf的转义字符

序列

说明

\a

警告字符,通常为ASCII的BEL字符

\b

后退

\c

抑制(不显示)输出结果中任何结尾的换行字符(只在%b格式指示符控制下的参数字符串中有效),而且,任何留在参数里的字符、任何接下来的参数以及任何留在格式字符串中的字符,都被忽略

\f

换页(formfeed)

\n

换行

\r

回车(Carriage return)

\t

水平制表符

\v

垂直制表符

\\

一个字面上的反斜杠字符

\ddd

表示1到3位数八进制值的字符。仅在格式字符串中有效

\0ddd

表示1到3位的八进制值字符

二、Shell test 命令

Shell中的 test 命令用于检查某个条件是否成立,它可以进行数值、字符和文件三个方面的测试。

test 与[] 有同样的效果,如:

  • [ $1 -ne $2 -a $1 -gt $2 ] 等价于 test $1 -ne $2 -a $1 -gt $2 等价于[[ $1 -ne $2 && $1 -gt $2 ]]

但是test一般不能和逻辑运算符混用

[root@hadoop02 shell01]# vim Demo5.sh 
#!/bin/bash
a=10
b=$1
echo "原有参数a=${a}"
echo "传递参数b=${b}"


if test -n "${b}" -a $1 -eq ${a}
then
        printf "字符不为空,"
        printf "字符长度为:${#b}\n"
        printf "结果:$1 = ${a}\n"
elif test -n "${b}" -a $1 -gt ${a}
then
        printf "字符不为空,"
        printf "字符长度为:${#b}\n"
        printf "结果:$1 > ${a}\n"
elif test -n "${b}" -a $1 -lt ${a}
then
        printf "字符不为空,"
        printf "字符长度为:${#b}\n"
        printf "结果:$1 < ${a}\n" 
else
        printf "请在执行代码时传递数值参数!\n"
fi
~                                                                                                                                                                                         
"Demo5.sh" 24L, 578C written                   
[root@hadoop02 shell01]# sh Demo5.sh 1
原有参数a=10
传递参数b=1
字符不为空,字符长度为:1
结果:1 < 10


三、Shell 流程控制

if条件判断语句

if condition1 
then
    command1 
elif condition2 
then
    command2 
else
    commandN 
fi


a=10
b=20
if [ $a == $b ]
then
   echo "a 等于 b"
elif [ $a -gt $b ]
then
   echo "a 大于 b"
elif [ $a -lt $b ]
then
   echo "a 小于 b"
else
   echo "没有符合的条件"
fi

for 循环

for var in item1 item2 ... ;
do
   command1 
   command2 ... 
   commandN 
done

for loop in 1 2 3 4 5
do
    echo "The value is: $loop"
done

The value is: 1
The value is: 2
The value is: 3
The value is: 4
The value is: 5

while 语句

while 循环用于不断执行一系列命令,也用于从输入文件中读取数据。其语法格式为:

while condition
do
    command
done

[hadoop@hadoop01 shell_1]$ vim 5.sh
#!/bin/bash
int2=10
while [ ${int2} -le 15 ]
do
        echo "${int2}"
        int2=`expr ${int2} + 1`
done
~                                                                                                                                                                                                                                        
"5.sh" [New] 7L, 108C written                                                                       
[hadoop@hadoop01 shell_1]$ chmod +x 5.sh
[hadoop@hadoop01 shell_1]$ sh 5.sh
10
11
12
13
14
15

无限循环

无限循环语法格式:

while :do
    command
done

或者

while truedo
    command
done

或者

for (( ; ; ))


until 循环

until 循环执行一系列命令直至条件为 true 时停止。

until 循环与 while 循环在处理方式上刚好相反。

一般 while 循环优于 until 循环,但在某些时候—也只是极少数情况下,until 循环更加有用。

until 语法格式:

until condition
do
    command
done

condition 一般为条件表达式,如果返回值为 false,则继续执行循环体内的语句,否则跳出循环。

[hadoop@hadoop01 shell_1]$ vim 5.sh
#!/bin/bash
int2=10
until [ ! ${int2} -le 15 ]
do
        echo "${int2}"
        int2=`expr ${int2} + 1`
done
~                                                                                                                                                                                                                                                                                                                                                            
"5.sh" 7L, 110C written                                                                             
[hadoop@hadoop01 shell_1]$ sh 5.sh 
10
11
12
13
14
15

case  多选择语句

case ... esac 为多选择语句,是一种多分枝选择结构,每个 case 分支用右圆括号开始,用两个分号 ;;

可以用 case 语句匹配一个值与一个模式,如果匹配成功,执行相匹配的命令。

case ... esac 语法格式如下:

case 值 in
模式1)
    command1
    command2
    ...
    commandN
    ;;
模式2)
    command1
    command2
    ...
    commandN
    ;;
esac

  • case 工作方式如上所示,取值后面必须为单词 in,每一模式必须以右括号结束。取值可以为变量或常数,匹配发现取值符合某一模式后,其间所有命令开始执行直至 ;;。
  • 取值将检测匹配的每一个模式。一旦模式匹配,则执行完匹配模式相应命令后不再继续其他模式。如果无一匹配模式,使用星号 * 捕获该值,再执行后面的命令

[hadoop@hadoop01 shell_1]$ vim 5.sh
#!/bin/bash
echo '请输入 1 到 4 之间的数字:'
echo '你输入的数字为:'
read aNum
case $aNum in
    1)  echo '你输入了 1'
    ;;
    2)  echo '你输入了 2'
    ;;
    3)  echo '你输入了 3'
    ;;
    4)  echo '你输入了 4'
    ;;
    *)  echo '你没有输入1到4之间的数字'
    ;;
esac                                                                                                                 
~                                                                                                                                                                                                                                        
"5.sh" 17L, 320C written                                                                            
[hadoop@hadoop01 shell_1]$ sh 5.sh 
请输入 1 到 4 之间的数字:
你输入的数字为:
1
你输入了 1


跳出循环---break命令

break命令允许跳出所有循环(终止执行后面的所有循环)。

跳出循环---continue命令

continue命令与break命令类似,只有一点差别,它不会跳出所有循环,仅仅跳出当前循环。

[hadoop@hadoop01 shell_1]$ vim 6.sh
#!/bin/bash
while :
do
    echo -n "输入 1 到 5 之间的数字: "
    read aNum
    case $aNum in
        1|2|3|4|5) echo "你输入的数字为 $aNum!"
        ;;
        6|7|8|9) echo "大了兄弟,小点小点"
          continue
        ;;
        *) echo "太大了,不和你玩了"
          break
        ;;
    esac
done
~                                                                                                                                                                                                                                        
"6.sh" 16L, 312C written                                                                            
[hadoop@hadoop01 shell_1]$ sh 6.sh 
输入 1 到 5 之间的数字: 3
你输入的数字为 3!
输入 1 到 5 之间的数字: 7
大了兄弟,小点小点
输入 1 到 5 之间的数字: 10
太大了,不和你玩了

四、Shell 函数

linux shell 可以用户定义函数,然后在shell脚本中可以随便调用。

[ function ] funname [()]
{


    action;


    [return int;]


}

说明:

  • 1、可以带function fun() 定义,也可以直接fun() 定义,不带任何参数。
  • 2、参数返回,可以显示加:return 返回,如果不加,将以最后一条命令运行结果,作为返回值。 return后跟数值n(0-255)

#!/bin/bash
demofun(){
        echo "shell函数"
}
echo "开始执行函数"
demofun
echo "执行完毕!"

#!/bin/bash
demofun(){
        echo "求余数"
        echo -n "输入被除数:"
        read a
        echo -n "输入除数:"
        read b
        c=`expr ${a} % ${b}`
        echo "余数是:${c}"
        return
}
echo "开始执行函数"
demofun
echo "执行完毕!"

#!/bin/bash
funWithParam(){
    echo "第一个参数为 $1 !"
    echo "第二个参数为 $2 !"
    echo "第十个参数为 $10 !"
    echo "第十个参数为 ${10} !"
    echo "第十一个参数为 ${11} !"
    echo "参数总数有 $# 个!"
    echo "输出所有参数 $* !"
    echo "脚本运行的当前进程ID号 $$ !"
    echo "后台运行最后1个进程ID号$! !"
    echo "输出所有参数 $@ !"
    echo "shell使用的当前选项 $- !"
    echo "输出最后命令的退出状态 $? !"
}
funWithParam 1 2 3 4 5 6 7 8 9 10 11

# 运行结果:
第一个参数为 1 !
第二个参数为 2 !
第十个参数为 10 !
第十个参数为 10 !
第十一个参数为 11 !
参数总数有 11 个!
输出所有参数 1 2 3 4 5 6 7 8 9 10 11 !
脚本运行的当前进程ID号 5707 !
后台运行最后1个进程ID号 !
输出所有参数 1 2 3 4 5 6 7 8 9 10 11 !
shell使用的当前选项 hB !
输出最后命令的退出状态 0 !

注意,通常不用$10 获取第10参数,获取第10参数用${10}。当n>=10时,使用${n}来获取参数。



五、Shell 输入/输出重定向

命令

说明

command  > file

将输出重定向到  file。

command  < file

将输入重定向到  file。

command  >> file

将输出以追加的方式重定向到  file。

n  > file

将文件描述符为  n 的文件重定向到 file。

n  >> file

将文件描述符为  n 的文件以追加的方式重定向到 file。

n  >& m

将输出文件  m 和 n 合并。

n  <& m

将输入文件  m 和 n 合并。

<<  tag

将开始标记  tag 和结束标记 tag 之间的内容作为输入。

一般情况下,每个 Unix/Linux 命令运行时都会打开三个文件:

  • 标准输入文件(stdin):stdin的文件描述符为0,Unix程序默认从stdin读取数据。
  • 标准输出文件(stdout):stdout 的文件描述符为1,Unix程序默认向stdout输出数据。
  • 标准错误文件(stderr):stderr的文件描述符为2,Unix程序会向stderr流中写入错误信息。
  • 默认情况下,command > file 将 stdout 重定向到 file,command < file 将stdin 重定向到 file。


案例: 

#运行Demo10.sh脚本,将输出内容写入Demo10.txt中
[root@hadoop02 shell01]# sh Demo10.sh 1 > Demo10.txt
#运行Demo10.sh脚本,将输出文件1和2合并内容并写入Demo1.txt中
[root@hadoop02 shell01]# sh Demo10.sh 1 > Demo1.txt 2>&1 
 
#其他同理

/dev/null 文件

如果希望执行某个命令,但又不希望在屏幕上显示输出结果,那么可以将输出重定向到 /dev/null:

$ command > /dev/null

/dev/null 是一个特殊的文件,写入到它的内容都会被丢弃;如果尝试从该文件读取内容,那么什么也读不到。但是 /dev/null 文件非常有用,将命令的输出重定向到它,会起到"禁止输出"的效果。

如果希望屏蔽 stdout 和 stderr,可以这样写:

$ command > /dev/null 2>&1

注意:0 是标准输入(STDIN),1 是标准输出(STDOUT),2 是标准错误输出(STDERR)。

这里的 2 和 > 之间不可以有空格,2> 是一体的时候才表示错误输出。

六、Shell 文件包含

  • Shell 可以包含外部脚本。这样可以很方便的封装一些公用的代码作为一个独立的文件。
  • 被包含的文件 **.sh 可以不需要可执行权限。

#Shell 文件包含的语法格式如下:
. filename   # 注意点号(.)和文件名中间有一空格
#或
source filename

Linux的Shell编程基础(下)--printf 命令/test 命令/流程控制/函数/输入与输出重定向/文件包含_hadoop


1、Linux的shell编程基础(上)

2、Linux的shell编程基础(中)-Shell字符串/数组/传递参数/运算符

Linux的Shell编程基础篇内容丰富,初学者可能需要花费一定的时间消化,收藏并分享吧

Linux的Shell编程基础(下)--printf 命令/test 命令/流程控制/函数/输入与输出重定向/文件包含_bash_02

Linux的Shell编程基础(下)--printf 命令/test 命令/流程控制/函数/输入与输出重定向/文件包含_bash_02

Linux的Shell编程基础(下)--printf 命令/test 命令/流程控制/函数/输入与输出重定向/文件包含_bash_02

Linux的Shell编程基础(下)--printf 命令/test 命令/流程控制/函数/输入与输出重定向/文件包含_bash_05

举报

相关推荐

0 条评论