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