我一直在尝试printf输出一些字符,给定它们的 ASCII 数字(十六进制)......像这样:
#!/bin/bash
hexchars () { printf '\x%s' $@ ;}
hexchars 48 65 6c 6c 6f
Expected output:
Hello
Run Code Online (Sandbox Code Playgroud)
出于某种原因,这不起作用。有任何想法吗?
编辑:
根据 Isaac 提供的答案(接受的答案),我最终得到了这个函数:
chr () { local var ; printf -v var '\\x%x' $@ ; printf "$var" ;}
Run Code Online (Sandbox Code Playgroud)
请注意,为了通过避免使用子shell来提高速度,我稍微改写了他的答案。
Result:
~# chr 0x48 0x65 0x6c 0x6c 0x6f
Hello
~# chr 72 101 108 108 111
Hello
~# chr {32..126}
!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}
Run Code Online (Sandbox Code Playgroud)
我猜这个chr函数的反函数应该是一个像...
asc () { printf '%d\n' "'$1" ;}
asc A
65
chr 65
A …Run Code Online (Sandbox Code Playgroud) 该命令会printf "#!/bin/bash\n" > t生成一个错误 ( bash: !/bin/bash\n": event not found),但按向上键不会调用该命令,因此我可以对其进行修改。这是为什么?
(我在这里尝试的东西可以通过printf "%s\n" '#!/bin/bash' >t我尝试学习 Bash 并且真的想了解为什么 bash 历史记录没有捕获上一个printf命令来完成。)
如何添加前导字符以将字符串填充到特定长度?
假设我想在字符串前面添加零,如果所述字符串短于 20 个字符:
printf '%020s\n' "$line"
Run Code Online (Sandbox Code Playgroud)
然而,这会用前导空格填充字符串,而不是其他任何东西,例如零。
该字符串可以是包含数字和其他字符的随机字符串。
我不想将字符串拆分为 number + rest for printf '%020i' $numberor printf '%020d $number'。
我目前的输出是:
shortstring
Run Code Online (Sandbox Code Playgroud)
我想要的输出是:
000000000shortstring
Run Code Online (Sandbox Code Playgroud) 我想重写这 2 个命令,以便它们仅使用符合 POSIX 的开关:
find "$TARGET_DIR" -maxdepth 1 -type d -printf '(DIR) %f\n'
find "$TARGET_DIR" -maxdepth 1 -type f -printf '%s %f ' -exec file -b {} \;
Run Code Online (Sandbox Code Playgroud)
-maxdepth 1可能可以替换为-prune,但-printf需要更复杂的重定向。
该命令printf '%.0s-' `seq 1 30`; echo在所有测试的 shell 中都能正常工作:
/bin/jsh : ------------------------------
/bin/attsh : ------------------------------
/bin/y2sh : ------------------------------
/bin/ash : ------------------------------
/bin/dash : ------------------------------
/bin/b203sh : ------------------------------
/bin/b43sh : ------------------------------
/bin/b44sh : ------------------------------
/bin/bash : ------------------------------
/bin/ksh : ------------------------------
/bin/ksh93 : ------------------------------
/bin/lksh : ------------------------------
/bin/mksh : ------------------------------
/bin/zsh : ------------------------------
/bin/zsh4 : ------------------------------
Run Code Online (Sandbox Code Playgroud)
除了 jsh(传家宝外壳),y2sh另一个外壳,版本 2.39和 lksh(传统 Korn 外壳)所有其他实现了 printf 内置:
/bin/attsh : printf is a shell builtin
/bin/ash : printf is a shell builtin
/bin/dash …Run Code Online (Sandbox Code Playgroud) 前言。我知道在该C语言中,该printf函数允许执行以下操作:
printf('%2$s %2$s %1$s %1$s', 'World', 'Hello');
Run Code Online (Sandbox Code Playgroud)
输出:Hello Hello World World
但在 GNU Bash 中似乎不支持此功能:
printf '%2$s %2$s %1$s %1$s' 'World' 'Hello'
Run Code Online (Sandbox Code Playgroud)
输出:bash: printf: $': invalid format character
我还尝试使用本地/usr/bin/printf:
/usr/bin/printf '%2$s %2$s %1$s %1$s' 'World' 'Hello'
Run Code Online (Sandbox Code Playgroud)
输出:/usr/bin/printf: %2$: invalid conversion specification
如何获取CBash 中的行为?谢谢。
编辑:
我对这种行为感到好奇,我无法接受改变参数顺序的解决方法。它应该只使用格式字符串就可以工作。
编辑:
例如,考虑 GNU Bash 源代码国际化。如果没有这个功能,这是非常不可能的。
我用下面要转换INT至炭和焦炭到INT在bash。但我不明白如何printf \\$(printf '%03o' $1)或printf '%d' "'$1"工作。请解释如何 printf \\$(printf '%03o' $1)和printf '%d'工作。
#!/bin/bash
# chr() - converts decimal value to its ASCII character representation
# ord() - converts ASCII character to its decimal value
chr() {
printf \\$(printf '%03o' $1)
}
ord() {
printf '%d' "'$1"
}
ord A
echo
chr 65
echo
Run Code Online (Sandbox Code Playgroud) $ printf "hi"
hi$ printf "hi\n"
hi
$ printf "hi\\n"
hi
Run Code Online (Sandbox Code Playgroud)
为什么最后一行不打印hi\n?
我正在 bash 中尝试 printf 格式,我遇到了这段代码:
#/bin/bash
divider===============================
divider=$divider$divider
header="\n %-15s %8s %10s %11s\n"
format=" %-15s %08d %10s %11.2f\n"
width=55
printf "$header" "ITEM NAME" "ITEM ID" "COLOR" "PRICE"
printf "%$width.${width}s\n" "$divider"
printf "$format" \
Triangle 13 red 20 \
Oval 204449 "dark blue" 65.656 \
Square 3145 orange .7
Run Code Online (Sandbox Code Playgroud)
我感兴趣的那一行是这样的:
printf "%$width.${width}s\n" "$divider"
Run Code Online (Sandbox Code Playgroud)
那个变量引用在做什么?这是什么意思?
如何使用 修复输出宽度printf?
这是一个示例脚本:
#!/bin/bash
OK=$(printf '\t%+50s\n' OK)
FAIL=$(printf '\t%+50s\n' FAIL)
for i in a aa aaa aaaa aaaaaa aaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaa; do
echo "$i $OK"
done
Run Code Online (Sandbox Code Playgroud)
输出:
a OK
aa OK
aaa OK
aaaa OK
aaaaaa OK
aaaaaaaaaaaaaaaaa OK
aaaaaaaaaaaaaaaaaaaaaaaaaa OK
Run Code Online (Sandbox Code Playgroud)
我想要这样的东西:
a OK
aa OK
aaa OK
aaaa OK
aaaaaa OK
aaaaaaaaaaaaaaaaa OK
aaaaaaaaaaaaaaaaaaaaaaaaaa OK
Run Code Online (Sandbox Code Playgroud) printf ×10
bash ×6
shell ×3
ascii ×1
command-line ×1
find ×1
linux ×1
newlines ×1
portability ×1
posix ×1
shell-script ×1
string ×1
zsh ×1