环境:RHEL 7.1 或 MAC 10.11.6
绝大多数命令使用 STDERR 作为错误信息输出,而将 STDOUT 作为正常输出。
1. 输出
1.1 echo
转义序列
(1)\n 打印换行
比如:echo "Your fruit basket constains:\n$FRUIT_BASKET"
(2)\t 打印制表符
比如:echo "Name \tUser Name\nSriranga\tranga\nSrivathsa\tvathsa"
(3)\c 后面不默认跟随换行,打印一个字符串,主要是当需要生成用户提示或诊断输出时使用。
比如:echo "Do you want to play a game? (y/n) \c"
如果遇到 echo 命令不理解 \c 转义序列,可以使用 echo -n "Do you want to play a game? (y/n)" 。
完整的可移植脚本如下:// TODO
注意,使用转义序列时,整个字符串都必须被引号引起来,并且转义序列出现在字符串中间,没有被空格隔开,以阻止 shell 将转义序列在命令行上展开。
1.2 printf
printf 命令是 C 语言中 printf 函数的 shell 版本,它提供了高度灵活的格式化输出。
与 echo 命令主要的不同是,printf 命令要在字符串后输出换行,必须要在所要打印字符串的后面明确指定 \n 转义符,而 echo 命令会自动打印出换行。
比如:printf "Is that a mango?\n"
printf 真正强大的地方是它能使用格式规范执行复杂的格式化功能。
语法格式:printf [format] [arguments]
arguments 是需要格式化的字符串。
format 是格式化序列的字符串,形式为:%[-]m.nx,其中 % 表示格式序列开始,x 指明格式序列的类型,x 可以为如下值:
(1)s 字符串
(2)c 字符
(3)d 十进制整数
(4)x 十六进制数
(5)o 八进制数
(6)e 指数浮点数
(7)f 固定浮点数
(8)g 紧密浮点数
根据 x 值的不同,整数 m 和 n 有不同的解释。
如果指定一个实数,n 表示精度。
例子:字符串格式化
printf "%16s\t%16s\n" "Name" "User name"
printf "%16s\t%16s\n" "Guo" "Li Jie"
printf "%16s\t%16s\n" "Ma" "Ping"
连字符 - 表示左对齐。
printf "%16s\t%16s\n" "Name" "User name"
printf "%16s\t%16s\n" "Guo" "Li Jie"
printf "%16s\t%16s\n" "Ma" "Ping"
1.3 输出重定向
(1) 把一个命令或脚本的输出重定向到文件而不是输出到 STDOUT,如果文件存在,内容将被覆盖。
cmd > file
比如:date > now
(2) 把命令列表的输出重定向到文件而不是输出到 STDOUT,如果文件存在,内容将被覆盖。
list > file
比如:{ date; uptime; who; } > mylog
(3) 追加到文件
cmd >> file
list >> file
(4) 将输出重定向到文件和屏幕
cmd | tee file
比如:date | tee now
绝大多数命令使用 STDERR 作为错误信息输出,而将 STDOUT 作为正常输出。
1. 输出
1.1 echo
转义序列
(1)\n 打印换行
比如:echo "Your fruit basket constains:\n$FRUIT_BASKET"
(2)\t 打印制表符
比如:echo "Name \tUser Name\nSriranga\tranga\nSrivathsa\tvathsa"
(3)\c 后面不默认跟随换行,打印一个字符串,主要是当需要生成用户提示或诊断输出时使用。
比如:echo "Do you want to play a game? (y/n) \c"
如果遇到 echo 命令不理解 \c 转义序列,可以使用 echo -n "Do you want to play a game? (y/n)" 。
完整的可移植脚本如下:// TODO
注意,使用转义序列时,整个字符串都必须被引号引起来,并且转义序列出现在字符串中间,没有被空格隔开,以阻止 shell 将转义序列在命令行上展开。
1.2 printf
printf 命令是 C 语言中 printf 函数的 shell 版本,它提供了高度灵活的格式化输出。
与 echo 命令主要的不同是,printf 命令要在字符串后输出换行,必须要在所要打印字符串的后面明确指定 \n 转义符,而 echo 命令会自动打印出换行。
比如:printf "Is that a mango?\n"
printf 真正强大的地方是它能使用格式规范执行复杂的格式化功能。
语法格式:printf [format] [arguments]
arguments 是需要格式化的字符串。
format 是格式化序列的字符串,形式为:%[-]m.nx,其中 % 表示格式序列开始,x 指明格式序列的类型,x 可以为如下值:
(1)s 字符串
(2)c 字符
(3)d 十进制整数
(4)x 十六进制数
(5)o 八进制数
(6)e 指数浮点数
(7)f 固定浮点数
(8)g 紧密浮点数
根据 x 值的不同,整数 m 和 n 有不同的解释。
如果指定一个实数,n 表示精度。
例子:字符串格式化
printf "%16s\t%16s\n" "Name" "User name"
printf "%16s\t%16s\n" "Guo" "Li Jie"
printf "%16s\t%16s\n" "Ma" "Ping"
连字符 - 表示左对齐。
printf "%16s\t%16s\n" "Name" "User name"
printf "%16s\t%16s\n" "Guo" "Li Jie"
printf "%16s\t%16s\n" "Ma" "Ping"
1.3 输出重定向
(1) 把一个命令或脚本的输出重定向到文件而不是输出到 STDOUT,如果文件存在,内容将被覆盖。
cmd > file
比如:date > now
(2) 把命令列表的输出重定向到文件而不是输出到 STDOUT,如果文件存在,内容将被覆盖。
list > file
比如:{ date; uptime; who; } > mylog
(3) 追加到文件
cmd >> file
list >> file
(4) 将输出重定向到文件和屏幕
cmd | tee file
比如:date | tee now
参考文献:
1. 《精通 shell 编程(第二版)》
没有评论:
发表评论