Linux 为ASCII表中的每个字符创建文件

Linux 为ASCII表中的每个字符创建文件,linux,bash,file,ascii,Linux,Bash,File,Ascii,我想做一个程序,将创建文件命名为字符从ASCII表。所以从1到127有128个文件 我是这样做的: #!/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 我知道它写

我想做一个程序,将创建文件命名为字符从ASCII表。所以从1到127有128个文件

我是这样做的:

    #!/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,10月份从0到177。问题是触摸$'\$x'无法正常工作

尽管触摸$'\101'将生成一个名为a的文件

有人能帮我吗?

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
请注意,只需要反引号来捕获命令的输出,以便在更大的表达式中使用。

这将起作用:

for num in {0..127}; do
    printf -v fname "\x$(printf '%x' "$num")"
    touch "$fname"
done
请注意,文件名中不允许使用空字符和/或空字符

这就是它的作用:

外层

printf -v fname '\xHH'
将num的值打印为十六进制数,然后用作外部printf的HH值

例如,num的值是十进制80。内部替换执行以下操作:

$ printf '%x' 80
50
因此,内部命令替换的值是50十六进制乘以80。现在命令变为

printf -v fname "\x50"
touch P
因为

$ printf "\x50"
P
下一个命令变为

printf -v fname "\x50"
touch P

这正是我们想要的。

请注意,不能创建名称包含空字节的文件。您必须从x=1开始。顺便说一句,将touch命令放在backticks中没有任何作用:它将尝试以命令的形式执行其输出,但没有任何与.Related、、等相关的内容。