【发布时间】:2021-10-18 23:15:27
【问题描述】:
您好,我正在学习使用 bash 编写脚本,我正在尝试解决一个小练习。 练习是这样的
如果名为“basenew”的变量包含变量的内容 命名为“价值基础”。 “basenew”必须包含超过 113,469 人物。如果两个条件都满足,那么脚本必须打印 变量“basenew”的最后 20 个字符。
我的代码是
#!/bin/bash
basenew="8dm7KsjU28B7v621Jls"
valuebase="ERmFRMVZ0U2paTlJYTkxDZz09Cg"
for i in {1..40}
do
basenew=$(echo $basenew | base64)
if [[ $basenew =~ $valuebase && ${#basenew} -ge 113469 ]] ; then
echo $i
echo $basenew | wc -c
StrLen=`echo ${basenew} | wc -c`
From=`expr $StrLen - 20`
echo $basenew | cut -c ${From}-${StrLen}
else
echo "error"
fi
done
但我卡住了,因为在循环 28 中打印,并且是最后 20 个但不是正确答案。
对使用 tail -c 20 打印最后 20 个字符有什么建议吗?
谢谢
【问题讨论】:
-
或许
"${basenew: -20: 20}"(gnu.org/software/bash/manual/html_node/…) -
我尝试但在此代码中给出相同的输出
StrLen=`echo ${basenew} | wc -c` From=`expr $StrLen - 20` echo $basenew | cut -c ${From}-${StrLen} -
@joop: "basenew" 包含...名为“valuebase”的变量 在您的示例中,basenew 比 valuebase 短,更长的字符串永远不能包含更短的一,所以你应该期待 error 在这里。
-
@joop:变量总是只包含字母和数字吗?如果它们可以包含特殊字符,您的方法可能会完全失败,因为
=~的右侧被视为正则表达式。您应该测试子字符串,而不是正则表达式匹配。 -
在内存中保留大量数据通常是一个糟糕的设计,而且通常很容易避免。
标签: bash for-loop if-statement tail