Linux自动化运维:Shell与Ansible(微课版)
上QQ阅读APP看书,第一时间看更新

1.2.4 数据输入输出

在Shell脚本中,可以使用多种命令来实现数据输入输出功能,其中常用的命令有echo命令、printf命令、read命令。

1. echo命令

V1-4 数据输入输出

echo是一个常用的Shell命令。它的主要功能是输出字符串,可以将指定的文本字符串输出到标准输出(默认是屏幕),也可以用于输出提示信息、调试信息、结果信息等。echo命令的基本语法如下。


echo [options] string

其中,options表示可选的命令选项;string表示要输出的字符串。echo命令选项如表1-2所示。

表1-2 echo命令选项

使用以下命令输出字符串,当输出的字符串中包含空格或其他特殊字符时,通常使用引号标识字符串,例如:


[opencloud@server ~]$ echo "Hello, World!"
Hello, World!

使用以下命令输出带有转义符的字符串,例如:


[opencloud@server ~]$ echo -e "Hello,\tWorld!"
Hello, World!

在脚本中,可以使用echo命令输出变量的值,例如:


[opencloud@server ~]$ cat echo.sh
#!/bin/bash
name="John"
age=18
echo "My name is $name,I am $age years old."
# 执行脚本,输出结果如下
[opencloud@server ~]$ bash echo.sh
My name is John,I am 18 years old.

在Shell中,echo命令支持一些常见的转义符,可以用来输出特殊字符。在使用转义符时,将字符串放在双引号之内。echo命令支持的转义符如表1-3所示。

表1-3 echo命令支持的转义符

使用echo命令和常见转义符的一些示例如下。


# 使用echo命令不换行输出字符串,继续在当前行输出 
[opencloud@server ~]$ echo -e "Hello,\cWorld!" 
Hello, [opencloud@server ~]$ 
# 输出转义符 
[opencloud@server ~]$ echo -e "\e"  
      
# 输出换页符 
[opencloud@server ~]$ echo -e "Hello,\fWorld!" 
Hello, 
      World! 
# 输出换行符 
[opencloud@server ~]$ echo -e "Hello,\nWorld!" 
Hello, 
World! 
# 输出水平制表符 
[opencloud@server ~]$ echo -e "Hello,\tWorld!" 
Hello,  World! 
# 输出垂直制表符 
[opencloud@server ~]$ echo -e "Hello,\vWorld!" 
Hello, 
      World! 

2. printf命令

在Shell脚本中,printf命令主要用于格式化输出字符串,输出带有特定格式的信息,如输出字符串、数字、字符、符号或者其他值。它与echo命令类似,但支持更多的格式化选项。

printf命令的基本语法如下。


printf format [argument...]

其中,format表示一个字符串,用于指定输出的格式,它可以包含转义序列,这些转义序列用于指定输出的格式和内容;argument表示一个或多个参数,用于提供要输出的内容。

printf命令需要在字符串中使用占位符,然后指定要输出的值。它可以通过在字符串中包含一些格式说明符,并按照格式说明符指定的格式将参数输出到标准输出。例如:


printf "%-10s %-8s %-4s\n" 姓名 性别 体重/kg
printf "%-10s %-8s %-4.2f\n" 郭靖 男66.1234
printf "%-10s %-8s %-4.2f\n" 杨过 男68.6543
printf "%-10s %-8s %-4.2f\n" 郭芙 女47.9876

输出结果如下。


姓名     性别   体重/kg 
郭靖     男      66.12 
杨过     男      68.65 
郭芙     女      47.99 

在这个示例中,%-10s表示输出一个左对齐且宽度为10的字符串;%-8s表示输出一个左对齐且宽度为8的字符串;%-4.2f表示输出一个左对齐且宽度为4,小数点后保留2位的浮点数。

printf命令使用的占位符如表1-4所示。

表1-4 printf命令使用的占位符

续表

printf命令使用%c格式化字符的示例如下。

(1)输出单个字符,例如:


printf "The first letter of the alphabet is %c\n" 'a'

输出结果如下。


The first letter of the alphabet is a

(2)输出字符数组中的所有字符,例如:


characters=('a' 'b' 'c')
printf "The characters are: %c %c %c\n" "${characters[@]}"

输出结果如下。


The characters are: a b c

(3)输出字符变量的值,例如:


letter='Z'
printf "The letter is: %c\n" "$letter"

输出结果如下。


The letter is: Z

printf命令使用%s格式化字符串的示例如下。

(1)输出单个字符串,例如:


printf "The name of this website is %s\n" "Stack Overflow"

输出结果如下。


The name of this website is Stack Overflow

(2)输出字符串数组中的所有字符串,例如:


names=('Alice' 'Bob' 'Eve')
printf "The names are: %s %s %s\n" "${names[@]}"

输出结果如下。


The names are: Alice Bob Eve

(3)输出字符串变量的值,例如:


greeting='Hello, world!'
printf "The greeting is: %s\n" "$greeting"

输出结果如下。


The greeting is: Hello, world!

printf命令使用%d格式化整数的示例如下。

(1)输出单个整数,例如:


printf "The number is: %d\n" 42

输出结果如下。


The number is: 42

(2)输出整数数组中的所有数字,例如:


numbers=(1 2 3)
printf "The numbers are: %d %d %d\n" "${numbers[@]}"

输出结果如下。


The numbers are: 1 2 3

(3)输出整数变量的值,例如:


count=5
printf "The count is: %d\n" "$count"

输出结果如下。


The count is: 5

printf命令使用%b格式化二进制整数的示例如下。

(1)输出单个二进制整数,例如:printf "The number is: %b\n" 5

输出结果如下。


The number is: 101

(2)输出二进制整数数组中的所有数字,例如:


numbers=(5 6 7)
printf "The numbers are: %b %b %b\n" "${numbers[@]}"

输出结果如下。


The numbers are: 5 6 7

(3)输出二进制整数变量的值,例如:


binary=1101
printf "The binary number is: %b\n" "$binary"

输出结果如下。


The binary number is: 1101

printf命令使用%n输出字符总数的示例如下。

(1)在字符串中使用%n,例如:


printf "There are %d characters in this string.%n" 8 count
echo "The value of count is: $count"

输出结果如下。


There are 14 characters in this string.
The value of count is: 38

(2)在字符串数组中使用%n,例如:


strings=('This is string 1' 'This is string 2')
printf "There are %d characters in string 1.%n" 100 count1
printf "There are %d characters in string 2.%n" 1000 count2
echo "The value of count1 is: $count1"
echo "The value of count2 is: $count2"

输出结果如下。


There are 100 characters in string 1.
There are 1000 characters in string 2.
The value of count1 is: 37
The value of count2 is: 38

printf命令使用%(datefmt)T格式化日期和时间的示例如下。

(1)输出当前日期和时间,例如:


printf "The current date and time is: %(%Y-%m-%d %H:%M:%S)T\n"

输出结果如下。


The current date and time is: 2023-01-08 20:41:08

(2)输出使用自定义格式的日期和时间,例如:


printf "The date and time is: %(%a %b %d %I:%M %p %Z %Y)T\n"

输出结果如下。


The date and time is: Sun Jan 08 08:44 PM CST 2023

3. read命令

在Shell脚本中,read命令是一个内置命令,用于从标准输入(通常是键盘)中读取一行文本并将其赋值给一个或多个变量。该命令通常用于在脚本运行时从用户那里获取输入。

read命令的基本语法如下。


read [options] variable1 [variable2...]

其中,options表示可选的命令选项,可以用于指定输入的格式;variable1表示一个变量名,将保存读取的输入值;variable2表示可选变量,用于将输入的值赋给多个变量。

read命令常见命令选项如表1-5所示。

表1-5 read命令常见命令选项

使用read命令读取变量并输出。


[opencloud@server ~]$ cat read.sh
#!/bin/bash
read -p "What is your name? " name
echo "Hello, $name"

执行脚本并查看输出结果。


[opencloud@server ~]$ bash read.sh
What is your name? # 在命令行中输入tom jerry并按Enter键
Hello, tom jerry

在这个示例中,脚本会先输出一行提示,询问用户的名字。此后,脚本将等待用户输入名字,并将输入的值赋给变量name。最后,脚本将输出一行提示。

使用read命令向用户询问密码,并隐藏其输入的内容。


[opencloud@server ~]$ read -sp "Enter your password: " password
Enter your password: #输入任何字符串,不会显示在屏幕上

在这个示例中,脚本会先输出一行提示,询问用户输入密码。此后,脚本将等待用户输入密码,输入的内容将被隐藏。最后,输入的值被赋给变量password。

使用read命令,向用户询问数字,只读取一个字符。


[opencloud@server ~]$ read -n 1 -p "Enter a number: " number
Enter a number: 1

在这个示例中,脚本会先输出一行提示,询问用户输入数字。此后,脚本将等待用户输入一个字符,并将输入的值赋给变量number。