Linux - seq,&& || ,xargs,数组,点歌脚本
目录
seq
作用:打印出一串有序的数列
print a sequence of numbers
sequence --》 序列,按顺序排列的数字
seq [OPTION]... LAST
seq [OPTION]... FIRST LAST
seq [OPTION]... FIRST INCREMENT LAST
默认步长值为1
步长值可以指定
-s 指定分隔符 默认是\n
-w 等宽输出 width ,用0来填充,达到宽度一致
打印1-5的数列
[root@localhost lianxi]# seq 5
1
2
3
4
5
############################################################################
打印 5-10的数列
[root@localhost lianxi]# seq 5 10
5
6
7
8
9
10
############################################################################
打印 1-10 间隔为2
[root@localhost lianxi]# seq 1 2 10
1
3
5
7
9
############################################################################
默认步长是 +1 的如果想产生一个倒着输出的数列
就要修改步长为-1
[root@localhost lianxi]# seq 10 -1 1
10
9
8
7
6
5
4
3
2
1
############################################################################
[root@localhost lianxi]# seq -w 8 13
08
09
10
11
12
13
############################################################################
[root@localhost lianxi]# seq -s + 8 13
8+9+10+11+12+13
seq主要和for循环配合使用,用来控制循环的次数
[root@localhost lianxi]# cat seq.sh
#! /bin/bash
for i in $(seq 5)
do
echo 第$i 次循环
done
############################################################################
&& ||
; 是命令连接符号,可以将多个命令写到一行,不管前面的命令是否执行成功,都会执行
cmd1;cmd2;cmd3
先执行cmd1再执行cmd2再执行cmd3,不管前面的命令是否执行成功,都会执行
cmd1&&cmd2
如果cmd1执行成功,就执行cmd2,如果cmd1执行失败,不执行cmd2
cmd1 || cmd2
如果cmd1执行不成功就执行cmd2,如果cmd1执行成功就不执行cmd2
cmd1 && cmd2 || cmd3
如果cmd1执行超过,就执行cmd2,如果cmd1执行失败就执行cmd3
练习:
1.判读用户feng是否存在,如果存在就设置密码,不存在就新建用户feng
id feng && echo 123456 | passwd feng --stdin || useradd feng
2.判断目录/backup是否存在,如果存在就不新建,不存在就新建/backup目录
[ -d /backup ] || mkdidr /backup
**如何判断目录是否存在?
1.cd
2.ls
3.stat
4.[ -d /backup ]
=============================
-d 判断文件是否是目录 directory
-f 判断文件是否是文件 file
-e 判断文件或者文件夹是否存在 exist
=============================
[ -d /backup ] || mkdidr /backup
############################################################################
xargs
将前面命令的输出送给构面的命令作为参数使用
用途:将参数列表转换成小块分段传递给其他命令
读入stdin的数据转换为参数添加到命令行中
让一些不支持管道的命令可以使用管道
xargs和管道的区别
管道:将前面命令的输出送给后面命令使用
xargs : 将前面命令的输出送给后面的命令作为参数使用
xargs需要依赖管道,知识将前面的命令的输出送给后面的命令作为参数使用而已
更加精确,让一些不支持管道的命令,也可以使用管道了
使用管道,不使用xargs:
[root@localhost lianxi]# which mkdir | ls -l
总用量 837752
-rw-r--r--. 1 root root 4 2月 8 16:59 123.txt
-rw-r--r--. 1 root root 0 2月 8 15:34 1.txt
-rw-r--r--. 1 root root 797264898 1月 26 21:43 2022-01-26-21_42_44-test.tar.gz
-rw-r--r--. 1 root root 56 1月 29 15:07 222.txt
-rw-r--r--. 1 root root 10 2月 8 15:22 2.txt
-rw-r--r--. 1 root root 10 2月 8 15:56 3.txt
-rw-r--r--. 1 root root 94 1月 26 21:42 7777.sh
-rw-r--r--. 1 root root 15 2月 8 16:27 abc.txt
drwxr-xr-x. 2 root root 6 1月 14 21:57 backup
-rw-r--r--. 1 root root 150 1月 25 16:30 backup_log.sh
-rw-r--r--. 1 root root 4 1月 30 16:15 bajie.txt
-rw-r--r--. 1 root root 160 12月 5 16:27 bbigfile.py
-rw-r--r--. 1 root root 134 12月 5 16:12 bigfile.py
-rw-r--r--. 1 root root 49274880 1月 20 20:00 boot.tar.gz
-rw-r--r--. 1 root root 391 1月 30 15:24 company.txt
-rw-r--r--. 1 root root 79 1月 27 20:11 creat_dir.sh
-rw-r--r--. 1 root root 239 1月 29 17:00 create_dir_v2.sh
-rw-r--r--. 1 root root 256 1月 26 16:22 deletefiles.sh
-rw-r--r--. 1 root root 283 1月 26 15:27 dir10_file10.sh
使用xargs:
[root@localhost lianxi]# which mkdir | xargs ls -l
-rwxr-xr-x. 1 root root 79768 8月 20 2019 /usr/bin/mkdir
数组
shell里面只有一维数组
数组使用小元括号括起来
元素的下标从0开始
声明数组
格式:数组名=(参数1 参数2......)参数与参数之间用空格隔开
例:
查看数组的元素
[root@localhost lianxi]# singer=(hudie wangchen jinzhiyan liyu)
[root@localhost lianxi]# echo ${singer[3]} --》输出singer数组里的第4个元素
liyu
查看数组元素的下标
[root@localhost lianxi]# echo ${!singer[@]}
0 1 2 3
查看数组里有多少元素:
[root@localhost script]# echo ${#a[*]}
10
查看数组里面所有元素:
[root@localhost script]# echo ${a[*]}
wang li zhao zhou wu yin chen tang feng wen
[root@localhost script]# echo ${a[@]}
wang li zhao zhou wu yin chen tang feng wen
删除数组元素里的元素
[root@localhost lianxi]# unset singer[2]
[root@localhost lianxi]# echo ${singer[@]}
hudie wangchen liyu
[root@localhost lianxi]# echo ${!singer[@]}
0 1 3
将元素删除以后,后面的元素不会向前面推进
========================================
练习:
取出w命令执行结果里的pts/0这一行里的ip地址,使用数组来完成
[root@localhost script]# w
12:07:17 up 6:45, 3 users, load average: 0.01, 0.03, 0.05
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root tty1 三11 1:21m 1.77s 1.77s -bash
root pts/0 192.168.44.1 三12 18:53m 0.26s 0.26s -bash
root pts/1 192.168.44.1 10:46 5.00s 0.25s 0.03s w
---------------------------
[root@localhost script]# a=($(w|grep pts/0))
[root@localhost script]# echo ${a[2]}
192.168.44.1
############################################################################
点歌脚本
shell版本:
歌手名单 name.txt
[root@localhost script]# cat name.txt
wang
li
zhao
zhou
wu
yin
chen
tang
feng
wen
#! /bin/bash
# 将name.txt 里面的内容取出来给数组singers
singers=($(cat name.txt))
# 控制循环次数
total=${#singers[*]}
for i in $(seq $total)
do
lucky_num=$((RANDOM % ${#singers[*]}))
echo "有请三创歌手 ${singers[$lucky_num]}给大家唱歌!"
sleep 1
echo "请以下歌手准备!"
sleep 1
unset singers[$lucky_num]
# 显示还有多少位歌手没有演唱
echo ${singers[*]}
# 重新生成一个数组,防止产生随机数抽取不到人
singers=($(echo ${singers[*]}))
done
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通