read

read 命令用于一个一个词组地接收输入的参数,每个词组需要使用空格进行分隔;如果输入的词组个数大于需要的参数个数,则多出的词组将被作为整体为最后一个参数接收。

实例及参数说明:

1
2
3
4
5
6
7
8
9
10
11
12
# 脚本 test.sh 内容

read firstStr secondStr
echo "第一个参数:${firstStr} 第二个参数:${secondStr}"

# 执行脚本 test.sh
sh test.sh
one two three

# 输出

第一个参数:one 第二个参数:two three

read 参数说明:

  • -p 输入提示文字
  • -n 输入字符长度限制(达到6位,自动结束)
  • -t 输入限时
  • -s 隐藏输入内容
    实例:
1
2
3
4
5
6
7
8
9
10
11
12
# 脚本 test.sh 内容

read -p "请输入一段文字:" -n 6 -t 5 -s password
echo -e "\npassword is $password"

# 执行脚本 test.sh
sh test.sh
请输入一段文字:
123456789
# 输出

password is 123456789

echo

从之前学习的例子看来,echo就是用于字符串的输出,这个字符串可以直接是字符串,也可以是变量。

具体的功能有以下几种:

显示普通字符串

1
2
3
4
5
6
7
8
# 这里字符串加不加双引号结果都是一样的

echo "It is a test"
echo It is a test

# 输出:

It is a test

显示转义字符

1
2
3
4
5
6
echo "\"It is a test\""
echo \"It is a test\" # 双引号也可以省略

# 输出:

It is a test

显示变量

有两种情况,一种是通过read命令读取用户输入的变量,然后输出;一种是脚本内部的变量,相当于字符串。

1
2
3
4
5
6
7
8
9
10
11
12
# 用户输入变量
#! /bin/sh
read name
echo "My name is ${name}"

# 执行
sh test.sh
Jerry

# 输出

My name is Jerry
1
2
3
4
5
6
7
8
# 脚本内部变量
#! /bin/sh
time=$(date)
echo "time is ${time}"

# 直接执行脚本并输出:

Sat Jun 29 15:41:38 UTC 2019

显示命令执行结果

以上通过变量获取时间再输出的方式,可以直接把获取时间的命令放在echo中输出:

1
2
3
4
5
# 脚本内容
echo `date`

# 输出
Sat Jun 29 15:41:38 UTC 2019

输出结果到文件中

通常用在写日志里

1
2
3
# 脚本内容
echo "time is `date`" > filename
echo "time is `date`" >> filename
  • 表示将echo的内容写进 filename文件中,若文件中已有内容,先删除后添加

  • 表示将echo 的内容追加到 filename 文件中,不删除文件原有内容

printf

学过C语言的应该都知道C的输出命令最常用的就是printf了,Shell中的printf也差不多,可以给输出的内容指定类型,具体语法如下:

1
2
3
4
printf  format-string  [arguments...]

- format-string: 为格式控制字符串
- arguments: 为参数列表

举个例子

1
2
3
4
5
6
#! /bin/bash

printf "%-10s %-8s %-4.2f\n" Jerry 男 62.2223

# 输出为:
Jerry 男 62.22

%s %c %d %f都是格式替代符

  • d: Decimal 十进制整数 – 对应位置参数必须是十进制整数
  • s: String 字符串 – 对应位置参数必须是字符串或者字符型
  • c: Char 字符 – 对应位置参数必须是字符串或者字符型
  • f: Float 浮点 – 对应位置参数必须是数字型

例子中的%-10s 指一个宽度为10个字符(-表示左对齐,没有则表示右对齐),任何字符都会被显示在10个字符宽的字符内,如果不足则自动以空格填充,超过也会将内容全部显示出来;%-4.2f 指格式化为小数,其中.2指保留2位小数。

更多实例说明:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 1.格式只指定了一个参数,但多出的参数仍然会按照该格式输出,format-string 被重用
printf "%s %s %s\n" a b c d e f g h i j

# 输出为
a b c
d e f
g h i
j


# 2.如果没有 arguments,那么 %s 用NULL代替,%d 用 0 代替

printf "%s and %d \n"

# 输出为
and 0