2017-10-10 126 views
0

我想创建一个程序,它将从ASCII表中创建名为字符的文件。因此,从1 128个文件127个为ASCII表中的每个字符创建一个文件

我做了这样的事情:

#!/bin/bash 

temp=0; 

for ((x=0; $x <= 177; x++)) ; do 
    temp=$((temp+1)) 
    if [ "$temp" = 8 ]; then 
    temp=$((0)) 
    x=$((x+3)) 
    fi 

    echo "$x" 

    `touch $'\"$x"'` 
done 

我知道它写的很古怪,但是这是什么程序做的是: 从10月从0数到127(如此0至177oct)。问题是touch $'\"$x"'无法正常工作。

尽管touch $'\101'将生成一个名为“A”的文件。

任何人都可以帮助我吗?

+0

请注意,您不能创建名称包含空字节的文件。你必须以'x = 1'开头。 – chepner

+0

顺便提一下'touch'命令不会做任何事情:它会尝试将其输出作为命令执行,但没有任何操作。 –

+0

相关,[在Unix和WIndows文件系统中哪些常见字符是非法的?](https://serverfault.com/q/242110/145545),[文件名中允许的字符](https://stackoverflow.com/q/4814040/608639)等 – jww

回答

0

bash没有提供任何特别简单的方式来产生给定ASCII码点的字符。 printf支持十进制值转换为十六进制表示:

$ printf '%x\n' 65 
A 

,但你需要一个bash扩展到十进制字符串转换为十六进制字符串用来构造标准格式:

# null characters not allows, start with x=1, not x=0 
for ((x=1; x <= 177; x++)); do 
    h=$(printf '%x' "$x") # e.g. 65 -> 41 
    c=$(printf "\\x$h") # e.g. 41 -> A 
    [[ $c = "/" ]] && continue #/is not a valid character for file names 
    touch "$c" 
done 

注意反引号只需要捕获命令的输出以在较大的表达式中使用。

1

这会工作:

for num in {0..127}; do 
    printf -v fname "\x$(printf '%x' "$num")" 
    touch "$fname" 
done 

注意,空字符和/不是在文件名不允许的。

下面是这样做:

printf -v fname '\xHH'

存储与在变量fname十六进制值HH(一个或两个数字)的字节。这解决了值为10(ASCII换行符)的问题,命令替换会剥离换行符(就像它在此答案的前一版本中那样),只留下空字符串。

printf '%x' "$num" 

打印num值作为一个十六进制数,然后将其用作外printfHH值。

说,例如,的num值为小数80.内取代执行此:

$ printf '%x' 80 
50 

所以内部命令替换的值是50(十六进制的80)。现在命令变为

printf -v fname "\x50" 

而且由于

$ printf "\x50" 
P 

下一个命令变得

touch P 

这正是我们想要的。

相关问题