我想创建一个程序,它将从ASCII表中创建名为字符的文件。所以128个文件从1到127
我做了类似的事情:
#!/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
我知道它的编写非常奇怪,但这个程序的作用是:
在oct中从0到127计数(从0到177oct)。问题是touch $'\"$x"'
无效。
虽然touch $'\101'
会生成一个名为“A”的文件。
有人能帮助我吗?
答案 0 :(得分:1)
这样可行:
for num in {0..127}; do
printf -v fname "\x$(printf '%x' "$num")"
touch "$fname"
done
请注意,文件名中不允许使用空字符和/
。
这是做什么的:
外部
printf -v fname '\xHH'
在变量HH
中存储带有十六进制值 fname
(一位或两位数)的字节。这解决了问题,对于值10(ASCII换行符),命令替换将剥离换行符(就像它在此答案的上一版本中所做的那样),只留下空字符串。
内在
printf '%x' "$num"
将num
的值打印为十六进制数字,然后将其用作外部HH
的 printf
值。
比如说,num
的值是十进制80.内部替换是这样的:
$ printf '%x' 80
50
因此内部命令替换的值是50(80的十六进制)。现在命令变为
printf -v fname "\x50"
因为
$ printf "\x50"
P
下一个命令变为
touch P
这就是我们想要的。
答案 1 :(得分: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
请注意,只需要捕获要在较大表达式中使用的命令输出的反引号。