目录
- 系统管理命令
cpu/memory/disk/process/os info/user/网络、防火墙、安全、ssh/其他。 - 常用命令
- 命令参考
curl/ps/top/netstat/su/screen/lsof/
1. 系统管理命令
- cpu/memory/disk/process/os info/user/网络、防火墙、安全、ssh/其他
## cpu
lscpu
cat /proc/cpuinfo
cat /proc/cpuinfo |grep "model name" #查看型号
cat /proc/cpuinfo |grep "physical id"|sort|uniq #可数物理cpu个数,都是0说明只有1个cpu
cat /proc/cpuinfo |grep "cpu cores" #可查看核数,也可以grep "core id"
cat /proc/cpuinfo |grep processor #可查看逻辑cpu数
## memory
lsmem
free -h #--human
free -m #-k,-m,-g
cat /proc/meminfo | grep MemTotal #查看内存总数
## disk
lsblk # 查看disk/part/mount point
fdisk -l #查看硬盘大小
# 查看文件系统类型、Size、Used、Avail、Mounted on等。
df -hT #df:Disk free 空余硬盘,也可查看mount信息,-T, --print-type print file system type
df -a #显示所有分区
du -h --max-depth=1 /usr #du:Disk usage 硬盘使用,统计文件及目录大小,哪些文件或目录最占用空间
du -sh * # -s参数显示总体,不展示子目录的下级目录或文件大小
# 查看文件系统superblock信息
dumpe2fs /dev/vdb1 #ext*文件系统
xfs_info /dev/vdb1 #xfs文件系统
## process
ps -ef|grep java
ps aux |head -n 1 & ps aux|grep java #加上列头显示
ps auxw #加w以显示完整的command,一个w显示还不完整就两个w
top
# 显示当前进程ID,即PID
echo $$
## os info
# 查看os版本信息,不同linux可能有所不同,如果无效,可进入/etc目录查找相关信息
cat /etc/redhat-release
lsb_release -a
uname -a #显示系统信息
## user and group
less -N /etc/group #所有组,-N显示行号
less +123 a.log #+行号跳到指定行
less /etc/shadow #系统存在的所有用户名
less /etc/passwd #系统存在的所有用户名
useradd
chmod
su
sudo su - #切到su用户
## 网络
yum -y install net-tools #包含了netstat
netstat -tunlp # centos7用ss
ifconfig
ip a
ip addr
ip link
# telnet后,如果Ctrl+C无法退出时,使用Ctrl+] 然后再输入quit退出,也可直接尝试quit
# yum install telnet -y
telnet host port
# 配置域名服务器,如下google域名服务器
cat >> /etc/resolv.conf <<EOF
nameserver 8.8.8.8
EOF
## 防火墙
systemctl start firewalld
systemctl stop firewalld
systemctl status firewalld #查看状态
firewall-cmd --state #查看默认防火墙状态
systemctl enable firewalld #开机启用
systemctl disable firewalld #开机禁用
# 防火墙放开指定端口,--permanent是永久,可能要reload才生效
firewall-cmd --add-port=8080/tcp --permanent # 如果用--add-rich-rule,后面需要指定参数
## ssh
ssh myhost #[ip/host]
ssh user@myhost "sudo ls /mnt"
# ssh远程执行脚本
# ssh免密登录
scp source.txt pc2:/mnt
scp -r source-dir pc2:/mnt
## 其他
lsof
journalctl
2. 常用命令
# init <runlevel> #linux有0-6共7个运行级别
init 0 #关机
init 6 #重启
shutdown #关机
shutdown –h now #立马关机
reboot #重启
# 启动时按F1可查看启动详情
hostname #查看主机名
hostname -i #查看IP
hostname -I #查看所有IP
hostnamectl set-hostname master
#时区时间设置
# cat
cat -A foo.txt #-A参数可以查看换行符
which java #在环境变量$PATH设置的目录里查找文件
whereis java #查找二进制文件、源代码文件和man手册页
yum list installed
yum search nginx
yum install nginx
yum remove nginx
yum update
yum install zip -y
yum install unzip -y
rpm -qa #列出所有已安装软件包
rpm -qpi a.rpm #显示软件包详情
rpm -i rpm-url #安装软件包
find /mnt -name myfilename
zip
zip -r test.zip /mnt/test/
unzip test.zip -d /mnt/
# tar
# -z或--gzip或--ungzip 通过gzip指令处理备份文件。
# -x或--extract或--get 从备份文件中还原文件。
# -c或--create 建立新的备份文件。
# -v或--verbose 显示指令执行过程。
# -f<备份文件>或--file=<备份文件> 指定备份文件。
tar -zcvf a.tar.gz src-file #压缩
tar -zxvf a.tar.gz #解压
tar -zxvf a.tar.gz -C /mnt/test
tar -xvf a.tgz -C /mnt/test
less
more
# >覆盖内容,>>追加内容
echo
echo "hello" > filename #覆盖
echo "hello" >> filename #追加
cat filename #查看内容
# 写入多行可以用<<自定义标记(如EOF)开始,最后一行以相同标记结束(如EOF)
cat > 1.txt <<EOF
aa
EOF
cat >> 1.txt <<EOF
bb
EOF
# 历史命令
history
history|grep ls
# ctrl+r输入命令查找,比如ctrl+r,然后输入ls查找最近ls命令
ctrl+r
# if
# if条件的写法[...]或((...)),大小比较方式不一样[ $a -gt 1 ],(( $a > 1 )); [...]多条件为[[...]];
a=1
b=1
c=1
if [ "$a" == "1" ];then echo 111;else echo 222;fi
if (( "$a" == "1" ));then echo 111;else echo 222;fi
if [ $a -gt 0 ];then echo 111;else echo 222;fi
if [ $a -ge 1 ];then echo 111;else echo 222;fi
if (( $a > 0 ));then echo 111;else echo 222;fi
if (( $a >= 1 ));then echo 111;else echo 222;fi
if (( $a == 1 && $b ==2 || $b == 1 ));then echo 111;else echo 222;fi
if [[ "$a" == "1" || "$b" == "2" || "$c" == "3" ]];then echo 111;else echo 222;fi
# 复杂条件
if [[ "$a" == "1" || "$a" == "2" ]] && [[ "$b" == "1" || "$b" == "2" ]]; then echo 111;else echo 222;fi
# 我的常用写法格式
if [[ "$a" == "1" ]]; then
echo 111
fi
# -z字符串长度为零
if [[ -z "$a" ]]; then echo empty;fi
# 包含,字符串运算符~或通配符
a=aaa
b=aaab
c=caaab
if [[ "$b" =~ "$a" ]];then echo 111;else echo 222;fi
if [[ "$c" == *"$a"* ]];then echo 111;else echo 222;fi
# 清空文件内容的几种方式
: > filename
> filename
echo "" > filename
echo > filename
cat /dev/null > filename
vi
# 按一个数字,然后按上下左右键可跳格,比如按5按向右,可向右跳5格字符。
# Ctrl+v可进可视状态,选中内容后,按y 就是copy,按 p就是 paste。
# less,移动的快捷键与vim一样,less按v进入编辑状态,保存操作同vim。
vim
# vim使用:set paste解决粘贴乱序问题
# 在复制yaml文件到xshell时,如果yaml文件有注释,会出现乱序问题,注释后面的行都自动加注释
vim a.yaml #进入编辑界面时,输入:set paste回车,然后再按a进入插入状态即可复制。:set nopaste可恢复之前的设置。
# vim搜索及高亮取消
# 命令模式下,输入/字符串,回车进行搜索,n下一个,N上一个,:nohlsearch或:set nohlsearch或:noh取消高亮。
# vim undo redo,在命令模式下:undo(简:u)、:redo,后面可以跟数字快速回滚。
#显示/隐藏行号
:set nu
:set nonu
# 从当前光标位置删除当前行后面的所有字符,D是d$的简写
D
d$
rm -f file
rm -rf dir
rm {1..10}.txt #正则删多个文件,删除1.txt到10.txt。不存在也不出错。
wget url
wget -c url #-c断点续传
curl <-Xaction> url -d 'body'
screen -ls
screen
screen -r screen1
screen --help
#-dmS name Start as daemon: Screen session in detached mode.
#-d (-r) Detach the elsewhere running screen (and reattach here).
#-m ignore $STY variable, do create a new screen session.
#-S sockname Name this session <pid>.sockname instead of <pid>.<tty>.<host>.
# 开启一守护进程screen
screen -dmS screen_foo echo "foo"
# 退出screen
screen -S screen_foo -X quit
# linux三剑客 grep/sed/awk
##
ps -ef|grep java
grep "echo" test.sh
grep -r "查询内容" /mnt -C 2 #查询出来的包括文件名+内容,加-i忽略大小写,后置的-C n显示命中目标的前后行数
grep -r -l "查询内容" /mnt #只显示包含内容的文件名
ls /mnt | grep -w demo #-w 全字匹配。demo、demo2只命中demo,但是有横杆-会分词,demo-2也命中
ls /mnt | grep -w ^demo$ #-w 全字匹配。demo、demo2、demo-2只命中demo
grep -x #整行匹配
grep -rinm 3 "hello world" a.log #-n显示行号,-m显示前几行,-m 3即前3行,-i忽略大小写,有空格用引号包起来
# 参数-A或--after-context下文、-B或--before-context上文、-C或--context上下文,显示匹配行的下文、上文、上下文指定行数
grep -r -A 2 foo ##-A 2同时显示下文2行
#在set -e情况下,如果grep没有匹配到内容可能会中断后续命令,将以示例存为demo.sh,执行后没有输入end
#!/bin/bash
set -ex
echo begin
a=foo bar
echo $a|grep foo
echo ---
echo $a|grep zar
echo end
systemctl list-units|egrep 'nginx|java|mysql' # egrep 正则式grep
# s后面是分隔符,比如/、#
sed -i "s/oldstring/newstring/g" file
sed -i "s#abc#cde#g" file
sed -i "s#dir/abc#dir2/cde#g" file #把内容dir/abc替换为dir2/cde
sed -i "s/\${name}/${name}/g" file #将file内容中带$的字符串${name}替换为name变量值
sed -i "2agood" filename#在第2行后面添加一行good,2是第N行,a是添加
sed -i 's/replicas:.*/replicas: 1/g' c.yaml #替换以replicas:开头的整行
sed -i '/foo/'d a.txt #删除包含foo字符串的行
sed 's#.*foo*#foo=/path/root#' readme.txt #替换包括指定字符串的整行,所有匹配的行都替换
# 插入内容
sed -i "2r b.txt" a.txt #在a.txt的第二行后面插入b.txt内容
# Mac下有所不同
sed -i '' 's/aa/bb/g' file
echo $PWD | awk -F/ '{print $NF}'
echo a.txt | awk '{print NR, $1,$3}' #显示每行的第1、第3项
echo a.txt | awk 'NR>1 {print NR, $1,$3}' #当前行大于1才显示,即从第2行开始显示
# {}用于定义一个代码块,其中包含了要执行的命令或操作。
# 单引号是为了确保$xx(如$1、$NF)被解释为字符串而不是变量。如果省略单引号,那么$xx会被解释为一个变量名
# NF是"number of fields"的缩写,意思是"字段数"或列数, 此处是最后一列
# print是AWK内置函数,用逗号分隔多个参数,在AWK代码块中也可以使用system()函数来执行外部命令,不过这样复杂不建议
# 在awk中,NR变量从1开始计数,所以在处理输入数据时,NR可以用来访问当前正在处理的行。
# 不熟悉awk的话,编写次序可以是awk '{}',再写print等代码{print ...}
#使用echo加管道自动完成交互,示例:
echo y|docker image prune
3. 命令参考
RPM
Red Hat Package Manager(简称RPM),Linux的一个系统软件包,类似于Windows“添加/删除程序”,但是功能又比“添加/删除程序”强很多 。此工具包最先是由Red Hat公司推出的,后来被其他Linux开发商所借用。
Yum
Yum(全称为 Yellow dog Updater, Modified)是一个在Fedora和RedHat以及CentOS中的Shell前端软件包管理器。基于RPM包管理,能够从指定的服务器自动下载RPM包并且安装,可以自动处理依赖性关系,并且一次安装所有依赖的软件包,无须繁琐地一次次下载、安装。补充:yum基于python写的。
apt-get
在centos上可以yum安装的包,在debian等系统上大多数都可以用apt-get安装
apt-get update #类似yum update
apt-get install mypackage -y
curl
# curl命令
curl url #get
curl -XGET url
curl -XPOST url
curl -XDELETE url
curl -XPOST url -H 'myheader' -d 'body'
curl -XPOST url --header 'myheader' --data 'body'
curl url --cookie "k=v;k2=v2"
curl url --cookie cookie.txt
curl url -c cookie.txt #保存response中的cookie?
curl url >> a.txt
curl url -o index.html
curl -O file-url #附件url
# 问号表达式多个参数,&前面要加\转义符,&在linux中是关键字
curl http://example.com/index?id=1\&name=tom
# 注意:数据有制表符可能会导致出错
# curl body中使用变量示例(-d 单...双单双-变量-双单双...单)
curl -XPOST http://localhost/create -H 'Content-Type: application/json' -d '
{
"Summary": "'"${summary}"'"
}'
curl -XPOST ... -d'
{
"settings": {
"number_of_shards": '$number_of_shards'
}
}'
# 其实是单引号双引号以及变量的关系,只有单*双*单*变量*单*双*单*这样对称结果的变量才是预期结果,示例如下
x=m
echo '1"$m"1,2"a${x}a'b${x}b'c${x}c"2'
# 运行结果:1"$m"1,2"a${x}abmbc${x}c"2
# curl 参数
curl --help
man curl
-X, --request COMMAND Specify request command to use. GET/POST/PUT/DELETE...
-b, --cookie STRING/FILE String or file to read cookies from (H). 传cookie
-c, --cookie-jar FILE Write cookies to this file after operation (H). 保存reponse的cookie
-H, --header LINE Custom header to pass to server (H)
-D, --dump-header FILE Write the headers to this file
-d, --data DATA HTTP POST data (H)
-o, --output FILE Write output to <file> instead of stdout. 我理解是网页另存为
-O, --remote-name Write output to a file named as the remote file. 我理解是重命名下载附件
-u, --user USER[:PASSWORD] Server user and password
curl命令详解
nohup
my.sh
内容
#!/bin/bash
echo "begin"
sleep 10
echo "end"
nohup ./my.sh > output.log 2>&1 &
nohup
是一个 Unix/Linux 命令,用于在后台运行程序并使其免受控制终端的关闭影响。它的全称是 "no hang up",因为它可以让程序不受挂断(hang up)信号的影响。
> output.log
用于将标准输出重定向到output.log文件>
符号用于重定向标准输出(stdout)。2>
符号用于重定向标准错误(stderr)。2>&1
将标准错误(stderr)重定向到标准输出(stdout),再加上前面的> output.log
,这样所有的输出都可以被写入到同一个文件output.log中了。末尾的
&
符号用于将命令放入后台运行。使用
nohup
启动my.sh
,使其可以忽略 SIGHUP 信号。结合nohup
和&
可以让命令在后台持续运行,即使终端会话被关闭。不加nuhup,由于末尾有&
也会后台运行,但是终端会话被关闭后,命令就会被终止。
ps
# ps参数
-A 显示所有程序。
-e 此参数的效果和指定"A"参数相同。
-f 显示UID,PPIP,C与STIME栏位。
# 各列含义:
UID PID PPID C STIME TTY TIME CMD
UID: 程序被该 UID 所拥有
PID: 就是这个程序的 ID
PPID:则是其上级父程序的ID
C: CPU使用的资源百分比
STIME:系统启动时间
TTY: 登入者的终端机位置
TIME:使用掉的 CPU 时间
CMD: 所下达的指令
top
# top运行后,再按相应键即可触发。
P – 以 CPU 占用率大小的顺序排列进程列表
M – 以内存占用率大小的顺序排列进程列表
N – 以 PID 的大小的顺序排列表示进程列表
E - 汇总数单位变化
e - 列表中单位变化
s – 改变画面更新频率
l – 关闭或开启第一部分第一行 top 信息的表示
t – 关闭或开启第一部分第二行 Tasks 和第三行 Cpus 信息的表示
m – 关闭或开启第一部分第四行 Mem 和 第五行 Swap 信息的表示
n – 设置在进程列表所显示进程的数量
h – 显示帮助
q – 退出 top
# top各列含义
PID:进程的ID
USER:进程所有者
PR:进程的优先级别,越小越优先被执行
NI:nice值-20至+19,正值低优先级,负值高优先级。如果任务的nice为+19,则表示它是一个高尚的、无私的任务,允许所有其他任务比自己享有宝贵的CPU时间的更大使用份额,这也就是nice的名称的来意。
VIRT:进程占用的虚拟内存
RES:进程占用的物理内存
SHR:进程使用的共享内存
S:进程的状态。S表示休眠,R表示正在运行,Z表示僵死状态,N表示该进程优先值为负数
%CPU:进程占用CPU的使用率
%MEM:进程使用的物理内存和总内存的百分比
TIME+:该进程启动后占用的总的CPU时间,即占用CPU使用时间的累加值。
COMMAND:进程启动命令名称
# top结果第一部分系统信息栏,示例
top - 23:06:17 up 90 days, 6:40, 1 user, load average: 0.00, 0.01, 0.05
Tasks: 148 total, 1 running, 147 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.3 us, 0.2 sy, 0.0 ni, 99.4 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
MiB Mem : 7821.1 total, 171.8 free, 5171.5 used, 2477.9 buff/cache
MiB Swap: 0.0 total, 0.0 free, 0.0 used. 2040.8 avail Mem
netstat
# 查看哪些IP连接本机
netstat -an
# 统计80端口连接数
netstat -nat|grep -i "80"|wc -l
# 统计httpd协议连接数
ps -ef|grep httpd|wc -l
# 统计已连接上的,状态为“established
netstat -na|grep ESTABLISHED|wc -l
# 查出哪个IP地址连接最多,将其封了.
netstat -na|grep ESTABLISHED|awk {print $5}|awk -F: {print $1}|sort|uniq -c|sort -r +0n
netstat -na|grep SYN|awk {print $5}|awk -F: {print $1}|sort|uniq -c|sort -r +0n
# 按状态统计连接数
netstat -an | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'
#LISTEN 13
#CLOSE_WAIT 936
#ESTABLISHED 4
#TIME_WAIT 2
netstat -tunlp #查看端口占用情况
netstat -ano|grep xxx.xxx.xxx.xxx:端口 -c #可输出统计结果。
# netstat参数,如-tunlp
-t:tcp
-u:udp
-p:占用端口的进程
-n:端口以数字形式表示,没有n直接显示服务名。
-l:正在监听的端口
su和su -的区别
su只是切换了root身份,但Shell环境仍然是普通用户的Shell;而su -连用户和Shell环境一起切换成root身份了。只有切换了Shell环境才不会出现PATH环境变量错误,报command not found的错误。
su切换成root用户以后,pwd一下,发现工作目录仍然是普通用户的工作目录;而用su -命令切换以后,工作目录变成root的工作目录了。
用echo $PATH命令看一下su和su - 后的环境变量已经变了。
sed
强大的&——样式匹配
将origin-string替换到replace-string当中
sed 's/John/[&]/' example.txt
需求:将开头为三位数字的外面再加一层{}
形式一:sed 's/^[0-9]{3}/{&}/'example.txt
带斜杆的替换
在字符替换中,可能会遇见引号,“/”等的替换,这时应该注意,sed的命令原型是:
sed -i "s/oldstring/goalstring/g" file
如果一个路径是data/path/abc,现在要将此路径换成一个字符串cde
但是这时跟在s后边的其实是分隔符,用以将oldstring替换成cde;他可以使用任意字符,这时如果字符串中有“/”,就会发生混乱,这时可以用#当做分隔符,就变成
sed -i "s#abc#cde#g" file
这时如果abc中包含“/”就可以随便替换了;
引号的替换:
需要将引号转义,使用反斜杠“\”,比如替换" ' 'div' ' ",如果需要将它替换成‘div' ;可以使用sed -i s#"''#'#g就能替换了。
实例:
sed -i 's#/opt/logs#/mnt/apollo/logs#' startup.sh
将 /opt/logs 替换为 /mnt/apollo/logs 分隔符是#号。
sed中使用变量及变量中存在特殊字符‘/’处理
https://www.cnblogs.com/qq931399960/p/11568084.html
使用多级单引号'。
screen
# 基本原理是开启新screen,然后在此screen中运行程序
# 注意进入screen再exit会删除
#
# 新建screen并进入
screen -S screen_name
# 新建screen守护进程
screen -dmS screen_name
# 运行dotnet命令示例
screen -dmS screen_name dotnet xxx.dll
# 退出screen(不是删除):ctrl+连续打a和d,试过ctrl+a然后单打d也是可以的
# 删除screen:screen_name也可以用id,也可以进入screen后执行exit
screen -X -S screen_name quit
# 回到screen
screen -r [id|screen_name]
# 示例
screen -S m2
dotnet my.dll
Ctrl+A,D
screen -ls
screen -r m2
screen -X -S m2 quit
#批量脚本示例
# 创建一screen守护进程但不进,然后执行一段执行
# new a screen and run some but not in.
#!/bin/bash
screen -ls
echo '----- -----'
echo 'input name to create screen:'
read screen_name
screen -dmS $screen_name
screen -x $screen_name -X stuff 'echo "i am in $screen_name."\n'
echo "end $screen_name"
# 示例 创建两个screen并启动myapp
screen -dmS screen-a
screen -dmS screen-b
screen -x screen-a -X stuff ' dotnet myapp.dll \n'
screen -x screen-b -X stuff ' dotnet myapp.dll \n'
# 退出
screen -x screen-b -X stuff ' ^C \n'
# 示例 创建多个screen,执行命令,然后获取日志
# delete
:> /tmp/screenlog_screen-a.log
:> /tmp/screenlog_screen-b.log
screen -S screen-a -X quit
screen -S screen-b -X quit
# create
screen -L -t screen-a -dmS screen-a
screen -L -t screen-b -dmS screen-b
# hello
screen -x screen-a -X stuff ' echo hello screen-a \n'
screen -x screen-b -X stuff ' echo hello screen-b \n'
# show logs
tail /tmp/screenlog_screen-a.log
echo
tail /tmp/screenlog_screen-b.log
echo
Screen技巧:记录屏幕日志
lsof
lsof(list open files)是一个列出当前系统打开文件的工具。在linux环境中一切皆文件,通过文件不仅仅可以访问常规数据,还可以访问网络连接和硬件。所以如传输控制协议 (TCP) 和用户数据报协议 (UDP) 套接字等,系统在后台都为该应用程序分配了一个文件描述符,无论这个文件的本质如何,该文件描述符为应用程序与基础操作系统之间的交互提供了通用接口。因为应用程序打开文件的描述符列表提供了大量关于这个应用程序本身的信息,因此通过lsof工具能够查看这个列表对系统监测以及排错将是很有帮助的。
journalctl
来自 https://www.cnblogs.com/cocowool/p/systemd_journal_log.html
在Systemd出现之前,Linux系统及各应用的日志都是分别管理的,Systemd开始统一管理了所有Unit的启动日志,这样带来的好处就是可以只用一个 journalctl命令,查看所有内核和应用的日志。
journalctl
journalctl -b
journalctl -k
journalctl -u kubelet
journalctl -p 5 -u kubelet
journalctl --since="2018-09-21 10:21:00" --until="2018-09-21 10:22:00"
关于命令或语法中的方括号,尖括号等符号
https://blog.csdn.net/weixin_46232231/article/details/105157751
方括号[]: 可选参数
尖括号<>: 必填参数
1.基本符号命令:
[]:内的内容意思是:可写可不写
{}:那就必须要在{}内给出的选择里选一个。
<>:表示必选
2.扩展命令符号:
方括号 [ ] 方括号 ( [ ] ) 表示里面的元素(参数、值或信息)是可选的。 您可以选择一个或多个条目,也可以不选。 不要将方括号本身也输入到命令行中。
尖括号 < > 尖括号 ( < > ) 表示里面的元素(参数、值或信息)是必需的。 您需要用相应的信息来替换尖括号里面的文本。
斜体 斜体文本表示您必须通过相应的值提供的信息。 它是一个要用值来替换的选项或参数。
管道 | 管道符号(竖线)含义是==“或者”==,它表示在一个元素内的一个选项。 如果两个参数由管道符号分隔开,您可以选择分隔符左边的元素,也可选择分隔符右边的元素。 在一次命令使用中不可同时选择两个元素。 在方括号中,这些选项是可选的。 在尖括号中,至少需要一个选项。
省略号 … 由三个句点 ( … ) 组成的省略号含义是==“等等”==,表示前述元素(参数、值或信息)可以在命令行中 多次重复。