Skip to content
← 返回文件与文本处理列表
文件与文本处理任务与配置

命令与脚本:终端、会话与日常操作 · 编写交互脚本、复用历史与安排执行 ​

返回分篇目录

编写交互脚本、复用历史与安排执行 ​

read 接收输入,echo/print 输出,eval 重新解释参数;大括号、历史编辑、信号处理、延迟与定时执行按相关语法相邻查阅。

read · 从标准输入(或文件)读取一行并将单词分配给变量 ​

更多信息:https://www.gnu.org/software/bash/manual/bash.html#index-read。

  • 读取键盘输入的数据赋值给变量:
bash
read {{变量}}
  • 把读取的一行按 IFS 分词后依次存入数组(不是逐行累积):
bash
read -a {{数组}}
  • 指定要读取的字符数,将数据赋值给变量:
bash
read -n {{字符数}} {{变量}}
  • 将多个数据依次赋值给多个变量:
bash
read {{_ 变量1 _ 变量2}} <<< "{{The surname is Bond}}"
  • 读取键盘输入的数据赋值给变量,不对\进行转义:
bash
read -r {{变量}}
  • 键盘输入前显示提示语:
bash
read -p "{{提示语:}}" {{变量}}
  • 静默模式(如果输入来自终端,则不回显字符)读取键盘输入的数据赋值给变量:
bash
read -s {{变量}}
  • 从标准输入读取每一行进行操作:
bash
while read line; do {{echo|ls|rm|...}} "$line"; done < {{标准输入|路径/到/文件|...}}

echo · 输出给定参数 ​

另请参阅:printf。 更多信息:https://www.gnu.org/software/coreutils/manual/html_node/echo-invocation.html。

  • 输出文本信息. 注意: 引号是可选的:
bash
echo "{{Hello World}}"
  • 输出带有环境变量的信息:
bash
echo "{{My path is $PATH}}"
  • 打印不带尾随换行符的信息:
bash
echo -n "{{Hello World}}"
  • 向文件添加信息:
bash
echo "{{Hello World}}" >> {{file.txt}}
  • 启用反斜杠转义的解释(特殊字符):
bash
echo -e "{{Column 1\tColumn 2}}"
  • 输出执行的上一条指令的退出状态(注:在 Windows 命令提示符和 PowerShell 中,对应的命令分别是 echo %errorlevel% 和 $lastexitcode):
bash
echo $?

print · Z Shell (zsh) 内置。打印参数,类似于 echo ​

另请参阅:echo, printf, zsh。 更多信息:https://zsh.sourceforge.io/Doc/Release/Shell-Builtin-Commands.html。

  • 打印输入:
bash
print "文本1" "文本2"
  • 以换行符分隔打印:
bash
print -l "第一行" "第二行" "第三行"
  • 不带尾随换行符打印:
bash
print -n "文本"; print "文本2"
  • 启用反斜杠转义:
bash
print -e "第一行\n第二行"
  • 按照 printf 所述打印参数(为了在 shell 之间实现更好的可移植性,请考虑改用 printf 命令):
bash
print -f "%s 今年 %d 岁了。\n" "小明" 30

其他同名命令的文档入口:

  • 查看 Zsh 内置命令的文档:
bash
tldr print.zsh
  • 查看 run-mailcap 的 print 别名的文档:
bash
tldr {{[-p|--platform]}} linux run-mailcap
  • 查看在 Windows 上打印文本文件的文档:
bash
tldr {{[-p|--platform]}} windows print.win

{ · 多用途 shell 语法 ​

更多信息:https://www.gnu.org/software/bash/manual/bash.html。

  • 隔离变量名:
bash
echo ${{{HOME}work}}
  • 使用大括号展开序列:
bash
echo {{{1..3}}} {{{a..c}}}{{{dir1,dir2,dir3}}}
  • variable 已设置且非空时展开后面的文本:
bash
echo ${{{variable:+variable is set and contains $variable}}}
  • variable 未设置或为空时展开默认值(不修改变量本身):
bash
echo ${{{variable:-default}}}
  • 返回 variable 的字符长度:
bash
echo ${{{#variable}}}
  • 返回字符串切片:
bash
echo ${{{variable:3:7}}}
  • 间接展开:把 variable 的值当作另一个变量名读取:
bash
echo ${{{!variable}}}
  • 将命令输出分组在一起:
bash
{ {{command1; command2; ...}} } | {{another_command}}

闭合大括号 } 与上面的 { 配对使用,参见 大括号的具体用法。

fc · 打开最近的命令进行编辑,然后运行它 ​

另请参阅:history。 更多信息:https://www.gnu.org/software/bash/manual/bash.html#index-fc。

  • 在默认系统编辑器中打开最后一个命令,并在编辑后运行:
bash
fc
  • 指定一个编辑器打开:
bash
fc -e '{{emacs}}'
  • 从历史记录中列出最近的命令:
bash
fc -l
  • 以相反的顺序列出最近的命令:
bash
fc -l -r
  • 从历史记录中编辑并运行一个命令:
bash
fc {{编号}}
  • 编辑并运行指定区间内的命令:
bash
fc '{{416}}' '{{420}}'
  • 显示帮助:
bash
fc --help

eval · 在当前 shell 中以单个命令的形式执行参数,并返回其结果 ​

更多信息:https://www.gnu.org/software/bash/manual/bash.html#index-eval。

  • 使用 'foo' 做为参数调用 echo:
bash
eval "{{echo foo}}"
  • 在当前 shell 程序中设置变量:
bash
eval "{{foo=bar}}"

trap · 在接收到事件时执行命令 ​

可用于对用户中断或其他操作执行清理。 更多信息:https://manned.org/trap.1posix。

  • 列出命令和预期事件的名称:
bash
trap
  • 在接收到信号时执行命令:
bash
trap 'echo "捕获到信号 {{SIGHUP}}"' {{HUP}}
  • 移除命令:
bash
trap - {{HUP}} {{INT}}

seq · 打印数字序列到标准输出 ​

更多信息:https://www.gnu.org/software/coreutils/manual/html_node/seq-invocation.html。

  • 从 1 到 10 的序列:
bash
seq 10
  • 从 5 开始,3 为步长,不超过 20 的序列:
bash
seq 5 3 20
  • 从 5 开始,3 为步长,不超过 20 的序列,并用空格作为分隔符:
bash
seq {{[-s|--separator]}} " " 5 3 20
  • 从 5 开始,3 为步长,不超过 20 的序列,并格式化为 4 位宽度,不足 4 位,前面补 0:
bash
seq {{[-f|--format]}} "%04g" 5 3 20

yes · 重复输出某些内容 ​

此命令通常用于对安装命令(如 apt-get)每个提示回答是。 更多信息:https://www.gnu.org/software/coreutils/manual/html_node/yes-invocation.html。

  • 重复输出“y”:
bash
yes
  • 重复输出“消息”:
bash
yes {{消息}}
  • 接受 apt-get 命令的所有提示:
bash
yes | sudo apt-get install {{程序}}
  • 重复输出一个换行符以始终接受提示的默认选项:
bash
yes ''

sleep · 延迟指定的一段时间 ​

更多信息:https://manned.org/sleep。

  • 按秒数延迟:
bash
sleep {{seconds}}
  • 在20秒延迟后执行指定命令:
bash
sleep 20 && {{command}}

at · 在稍后时间执行命令 ​

结果将被发送到用户的邮箱。 更多信息:https://manned.org/at。

  • 交互式创建命令并在 5 分钟后执行(完成后按 <Ctrl d>):
bash
at now + 5 minutes
  • 交互式创建命令并在特定时间执行:
bash
at {{小时:分钟}}
  • 在下一个 10:00 AM 执行从标准输入提交的命令(当天已过该时刻时通常安排到次日):
bash
echo "{{命令}}" | at 1000
  • 在下周二晚上 9:30 从指定文件执行命令:
bash
at -f {{路径/到/文件}} 9:30 PM Tue
  • 列出当前用户的所有待执行任务(等同于 atq):
bash
at -l
  • 查看指定任务:
bash
at -c {{任务编号}}

just · just 可以指代多个具有相同名称的命令 ​

  • 查看命令运行器的文档:
bash
tldr just.1
  • 查看 V8 JavaScript 运行时的文档:
bash
tldr just.js

继续阅读