我的脚本创建了一组目录 aa、ab、ac 等等
该脚本自动增加目录名称,但我想在创建目录时避免使用字母:I,O,P,Q,R,W。
我的脚本包含以下内容:
#!/bin/bash
path='/tmp/ab'
dir_name=ls -lrt | tail -1
export dir_name
new_name=perl -e 'print ++$ENV{dir_name}'
mkdir -p $new_name
请提出修改建议。
答案1
这是一个 awk 脚本,允许您生成 AA、AB、AC、AD、AE、AF、AG、AH、AJ、AK、AL、AM、AN、AS、AT、AU、AV、AX、AY、AZ、BA、... 序列(代替您拥有的 perl 单行代码):
awk ' BEGIN {
alphabet = ""
for (ind = 1; ind <= 26; ind++) {
letter = substr("ABCDEFGHIJKLMNOPQRSTUVWXYZ", ind, 1)
if (index("IOPQRW", letter) == 0) alphabet = alphabet letter
}
alphalen = length(alphabet)
}
NF != 1 || $1 ~ "[^" alphabet "]" {
print "bad input" > "/dev/stderr"
exit
}
{
word = $1
Len = length(word)
for (i = Len; i >= 1; i--) {
letter = substr(word, i, 1)
val = index(alphabet, letter)
if (val <= 0 || val > alphalen) {
print "This should never happen." > "/dev/stderr"
exit
}
carry = 0
if (val == alphalen) {
val = 0
carry = 1
}
letter = substr(alphabet, val+1, 1)
word = substr(word, 1, i-1) letter substr(word, i+1, Len)
if (!carry) break
}
if (carry) word = substr(alphabet, 1, 1) word
print word
} '
该BEGIN
部分动态构建 ABCDEFGHJKLMNSTUVXYZ 字母表。您可以这样说
alphabet = "ABCDEFGHJKLMNSTUVXYZ"
上面的代码让你指定要排除的字母。“错误输入”块拒绝空白输入、多个单词和带有排除字符的单词。
主块从右到左循环给定的单词,执行与将 1 添加到多位十进制数时所执行的操作相同的操作:
- 如果您有最大符号值(十进制为“9”,方案为“Z”),请将其替换为最低符号并向左移动,
- 否则,用下一个更高的符号替换该符号并停止。由于 ,
alphabet
我们有 之后的下一个更高的符号H
是J
, 之后的下一个更高的符号N
是S
, 之后的下一个更高的符号V
是X
。 - 如果到达单词开头而没有“结束”,则在前面添加一个
A
。例如,ZZ
变成AA
which 然后变成AAA
。
因此,如果您在 中有一个名字dir_name
,则可以使用
new_name=$(echo "$dir_name" | awk '(以上脚本)')您可能可以去掉“这绝不应该发生。”错误测试。我不知道该错误可能发生的任何方式;我只是想安全。如果您绝对确定您的 shell 脚本永远不会将无效数据传递给 awk 脚本,则可以去掉“错误输入”错误测试。