如何缩短这个 shell 脚本?
CODE="A"
if test "$CODE" = "A"
then
PN="com.tencent.ig"
elif test "$CODE" = "a"
then
PN="com.tencent.ig"
elif test "$CODE" = "B"
then
PN="com.vng.pubgmobile"
elif test "$CODE" = "b"
then
PN="com.vng.pubgmobile"
elif test "$CODE" = "C"
then
PN="com.pubg.krmobile"
elif test "$CODE" = "c"
then
PN="com.pubg.krmobile"
elif test "$CODE" = "D"
then
PN="com.rekoo.pubgm"
elif test "$CODE" = "d"
then
PN="com.rekoo.pubgm"
else
echo -e "\a\t ERROR!"
echo -e "\a\t CODE KOSONG"
echo -e "\a\t MELAKUKAN EXIT OTOMATIS"
exit
fi
使用
case
语句(可移植,可在任何类似sh
shell 中工作):我还建议将变量名从所有大写字母(如
CODE
)更改为小写或混合大小写(如code
orCode
)。有许多具有特殊含义的全大写名称,并且不小心重复使用其中一个可能会造成麻烦。其他说明:标准约定是将错误消息发送到“标准错误”而不是“标准输出”;
>&2
重定向执行此操作。此外,如果脚本(或程序)失败,最好以非零状态 (exit 1
) 退出,这样任何调用上下文都可以判断出了什么问题。也可以使用不同的状态来指示不同的问题(有关一个很好的示例,请参见手册页的“退出代码”部分)。curl
(感谢 Stéphane Chazelas 和 Monty Harder 提供的建议。)我建议
printf
不要使用echo -e
(andecho -n
),因为它在操作系统、版本、设置等之间更具可移植性。我曾经有一堆脚本中断,因为操作系统更新包含使用不同选项编译的 bash 版本,这改变了echo
行为方式。$CODE
这里不需要双引号。a 中的字符串case
是少数可以安全地将其关闭的上下文之一。但是,我更喜欢双引号变量引用,除非有特定的理由不这样做,因为很难跟踪它在哪里是安全的,在哪里不安全,所以习惯性地双引号会更安全。假设您使用的是
bash
4.0 或更高版本...在代码中,我定义了一个包含所有域名的关联数组,每个域名都与一个小写字母键相关联。
变量被分配了对应于该数组中小写值
$PN
的域名$CODE
(仅${CODE,,}
返回$CODE
转换为小写字母的值),但如果$CODE
不对应于domain
列表中的有效条目,则退出脚本并返回错误。参数替换将
${variable:?error message}
扩展为$variable
(代码中的适当域)的值,但如果值为空不可用,则会退出脚本并显示错误消息。您不会得到与代码中完全相同的错误消息格式,但如果无效,它的行为本质上是相同的:$CODE
如果您关心字符数,我们可以进一步缩短:
除了删除不必要的换行符之外,我还
com.
从每个域中删除了(而是添加到分配给PN
)。请注意,即使对于多字符值,上面的所有代码也适用(如果数组
$CODE
中存在小写键)。domain
如果
$CODE
是数字(从零开始)索引,这将简化代码:这还使得
domain
从每行包含一个条目的辅助文件中读取数组变得非常容易:如果你的 shell 允许数组,最短的答案应该是 bash 中的这个例子:
那是假设
$code
只能是a,b,c或d。如果没有,请添加如下测试:
我打算把这个答案换个方向。与其将数据编码到脚本中,不如将数据放入单独的数据文件中,然后使用代码搜索文件:
分离这些问题有几个好处:
look
来有效地对它进行二进制搜索(而不是逐行grep
或awk
)您正在使用字母来索引值,如果您要使用数字,它变得如此简单:
那是可移植的 shell 代码,适用于大多数 shell。
对于 bash,您可以使用:
pn=${!code}
,或者对于 bash/ksh/zsh 使用:pn=${@:code:1}
。字母
如果您必须使用字母(从 a 到 z 或 A 到 Z),则必须将它们转换为索引:
在更长的代码中阐明每个部分的意图和含义:
如果需要转换为小写值,请使用:(
$(( asciival & ~32 ))
确保 ascii 值的第 6 位未设置)。错误代码
您的脚本在错误时打印的输出很长(而且特别长)。
处理它的最通用方法是定义一个函数:
然后使用您需要的特定消息调用该函数。
请注意,结果退出值由下式给出
exitcode
(此处示例为 27)。一个完整的脚本(带有错误检查)然后变成: