我仍在学习如何shell脚本,并且面临着使我更容易回显“ Name1”“ Name2” ...“ Name15”的挑战,而且我不太确定从哪里开始。我有想法,但是如果我搞砸了,我不想显得傻。有帮助吗?
我实际上还没有尝试过任何东西,但大多数人都只是想过。
#This is what I wrote to start
#!/bin/bash
echo "Name1"
echo "Name2"
echo "Name3"
echo "Name4"
echo "Name5"
echo "Name6"
echo "Name7"
echo "Name8"
echo "Name9"
echo "Name10"
echo "Name11"
echo "Name12"
echo "Name13"
echo "Name14"
echo "Name15"
我的预期结果显然只是为了输出“ Name1”,“ Name2”等。但是我正在寻找一种更具创造性的方法。如果可能的话,可以通过几种方式做到这一点,以便我学习。谢谢。
答案 0 :(得分:5)
最简单(可能不是最具创造力)的方法是使用printf
:
printf "%s\n" name{1..15}
这取决于bash大括号扩展{1..15}
具有15个字符串。
答案 1 :(得分:2)
使用for循环
for i in {1..15};do echo "Name$i";done
答案 2 :(得分:1)
一些深奥的解决方案,从最小到最不合理:
base64编码的字符串:
base64 -d <<<TmFtZTEKTmFtZTIKTmFtZTMKTmFtZTQKTmFtZTUKTmFtZTYKTmFtZTcKTmFtZTgKTmFtZTkKTmFtZTEwCk5hbWUxMQpOYW1lMTIKTmFtZTEzCk5hbWUxNApOYW1lMTUK
怪异链是您期望的结果,以base64编码,该编码通常用于将二进制数据表示为文本。 base64 -d <<< weirdChain
正在将怪异的链作为输入传递到base64
工具,并要求对其进行解码,以显示您的预期结果
生成无限的“名称”流,将其截断,使用行号:
yes Name | awk 'NR == 16 { exit } { printf("%s%s\n", $0, NR) }'
yes
输出作为参数传递的无限流(默认情况下为y
,用于自动交互要求[y / n]确认的交互式脚本)。 awk
命令到达第16行后即退出,否则打印其输入(由yes
提供)后跟行号。使用head -15
可以很容易地完成截断,而我尝试使用nl
“数字行”实用程序或grep -n
来对数字行进行操作,但是他们总是将行号添加为前缀这需要额外的重新格式化步骤。
读取随机二进制数据,希望在您要输出的所有行上迷路:
timeout 1d strings /dev/urandom | grep -Eo "Name(1[0-5]|[1-9])" | sort -uV
strings /dev/urandom
将从二进制随机源/ dev / urandom中提取ascii序列,grep
将过滤那些符合预期输出行格式的序列,而sort
将对这些序列进行重新排序线以正确的顺序。由于sort
在重新排序之前需要先收到其全部输入,并且/dev/urandom
不会停止产生数据,因此我们使用timeout 1d
在整整之后停止从/dev/urandom
读取数据希望有一天它能够筛选出足够的随机数据来找到您的15条线(我不确定这可能性很小)。
使用HTTP客户端检索此页面,提取您发布的bash脚本并执行。
my_old_script=$(curl "https://stackoverflow.com/questions/57818680/" | grep "#This is what I wrote to start" -A 18 | tail -n+4)
eval "$my_old_script"
curl
是一个可用作HTTP客户端的命令行工具,grep
及其-A 18
参数将选择“这是我写的开始内容”文本,接下来的18行,tail
将删除前3行,而eval
将执行脚本。
虽然它将比以前的解决方案更加有效,但是它是一个更为不合理的解决方案,因为高级用户可以编辑您的问题,以使该解决方案在您的计算机上执行任意代码。理想情况下,您将使用支持HTML的解析器,而不是使用基本的字符串操作来提取代码,但是我们在这里不是在讨论最佳做法...