在 Bash 中循环遍历字母
Posted
技术标签:
【中文标题】在 Bash 中循环遍历字母【英文标题】:Looping through alphabets in Bash 【发布时间】:2011-11-10 03:12:45 【问题描述】:我想mv
所有以'x'开头的文件到目录'x';类似:
mv path1/x*.ext path2/x
对所有字母 a, ..., z 都这样做
如何编写一个 bash 脚本,让 'x' 在字母表中循环?
【问题讨论】:
【参考方案1】:这应该让你开始:
for letter in a..z ; do
echo $letter
done
【讨论】:
【参考方案2】:for x in a..z
do
echo "$x"
mkdir -p path2/$x
mv path1/$x*.ext path2/$x
done
【讨论】:
请问为什么在第 4 行和第 5 行用大括号将 x 括起来? 这里不是必需的,但是很好,它可以工作,并且使参数更加突出;)gnu.org/software/bash/manual/… 通常"$x"
就足够了,而且是让它脱颖而出的更好方法。
@WeijunZhou 如果您想扩展变量 x 后跟字母 'y' 和 'z',这将是一个问题。如果您尝试扩展 "$xyz"
,解释器会认为您正在尝试打印一个名为 xyz 的变量,而 "$xyz"
会让解释器确切知道您要做什么
我的意思是"$x"yz
。【参考方案3】:
这是使用嵌套大括号扩展生成西班牙字母表的方法
for l in a..n,ñ,o..z; do echo $l ; done | nl
1 a
...
14 n
15 ñ
16 o
...
27 z
或者干脆
echo -e a..n,ñ,o..z"\n" | nl
如果要生成obsolete 29 个字符的西班牙字母表
echo -e a..c,ch,d..l,ll,m,n,ñ,o..z"\n" | nl
法文字母或德文字母也可以这样做。
【讨论】:
避免拆分字母的丑陋替代方案:for j in $(for i in $(echo a..z ñ ch ll ); do echo $i; done| sort | xargs); do echo "Hello-$j"; done
【参考方案4】:
使用rename
:
mkdir -p path2/a..z
rename 's|path1/([a-z])(.*)|path2/$1/$1$2' path1/a..z*
如果您想从文件名中去除前导 [a-z] 字符,更新后的 perlexpr 将是:
rename 's|path1/([a-z])(.*)|path2/$1/$2' path1/a..z*
【讨论】:
【参考方案5】:也是大写的
for letter in a..z,A..Z; do
echo $letter
done
【讨论】:
【参考方案6】:这个问题和答案对我的问题有所帮助。 我需要在 bash 中放大字母表的一部分。
虽然扩展is strictly textual
I found a solution: 并让它变得更加简单:
START=A
STOP=D
for letter in $(eval echo $START..$STOP); do
echo $letter
done
结果:
A
B
C
D
希望它对寻找我必须解决的相同问题的人有所帮助, 也在这里结束
【讨论】:
【参考方案7】:我希望这会有所帮助。
对于 a..z 中的 i
因为我在 A..Z
对于我在 a..z,A..Z
根据需要使用循环。
【讨论】:
其他答案已经涵盖了这一点。请不要添加重复项,或解释您的答案比以前的答案更好。以上是关于在 Bash 中循环遍历字母的主要内容,如果未能解决你的问题,请参考以下文章
在linux shell(bash)编程中,如何通过递归方式遍历文件