2017-10-10 72 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 

這正是我們想要的。

相關問題