Answers:
简单的方法(更有效)是通过for循环(在一行上,但是为了清楚起见,在此处显示为多行):
for i in {date,grade}; do
apt up${i}
done
明智的方法是~/.bashrc
为这两个命令添加别名,而不必再重新键入:
alias upgrade=' sudo apt update && sudo apt upgrade'
精心设计的方法是这样做的:
$ echo sudo" "apt" "up{"date","grade"}" && " :
sudo apt update && sudo apt upgrade && :
看看发生了什么事?我们正在构建要由shell运行的有效文本字符串。现在,您所需要做的就是使用eval
而不是echo
。但是eval
通常不建议在Shell脚本中使用,并且此命令比for循环更复杂且不可移植。变化对无EVAL主题(和最短的,到目前为止,但效率不高,由于管和大量的命令echo
,二apt
,sudo
和sh
所以很多分叉的):
$ echo "apt "{update,upgrade}";"|sudo sh
我们还可以使用set
将所需序列转换为位置参数,并仅apt
使用$1
and $2
args 执行:
$ set {update,upgrade}; echo apt $1 && echo apt $2
apt update
apt upgrade
或者也可以再次使用for循环,因为如果您未在其中指定序列,则默认情况下会处理位置参数 for variable (sequence)
$ set {update,upgrade} ; for i; do echo apt $i ;done
apt update
apt upgrade
set
在很多使用shell的专业人士中,我看到使用是一种非常普遍的技术,这是有充分的理由的-这种方法非常便携,可以在/bin/sh
没有阵列或{a,b,c}
扩展的情况下使用。因此POSIX的可移植方式是set update upgrade ; for i; do echo apt $i ;done
。此外,这应该是有效的。
或者我们可以走while
循环路线:
$ echo {date,$'\n',grade}|while read i;do echo apt up${i}; done
apt update
apt upgrade
当然,请记住在没有echo
实际执行命令的情况下运行它
for i in {date,grade}; do sudo apt up${i}; done
~/.bash_aliases
。此文件应由自动提供~/.bashrc
。
apt
带有不同参数(更新和升级)的两个命令(是的,这是两个命令)时,这样做毫无意义,所以我仍然要说for循环是
for i in date grade; do
upgrate
。
使用xargs
而不是的另一个简单选项for
:
echo up{dat,grad}e | xargs -n1 apt
测试:
$ echo up{dat,grad}e | xargs -n1 echo apt
apt update
apt upgrade
printf "%s\n" {date,grade} | xargs -I% -n1 echo apt up%
尽管可能更长一些,但主题可能有所不同
printf '%s'
通常是个好习惯,因为您无法逃脱它,例如使用--help
或-e
。
printf '%s\0'
会更好,它xargs
有一个标记来处理终止为null的args