标签: printf

给定一些 ASCII 数字,使用 `printf` 输出字符

我一直在尝试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)

bash printf

8
推荐指数
1
解决办法
450
查看次数

为什么 Bash 历史记录没有记录这个命令?

该命令会printf "#!/bin/bash\n" > t生成一个错误 ( bash: !/bin/bash\n": event not found),但按向上键不会调用该命令,因此我可以对其进行修改。这是为什么?

(我在这里尝试的东西可以通过printf "%s\n" '#!/bin/bash' >t我尝试学习 Bash 并且真的想了解为什么 bash 历史记录没有捕获上一个printf命令来完成。)

command-line bash printf

7
推荐指数
1
解决办法
2658
查看次数

使用 printf 或 echo 在字符串前添加前导字符

如何添加前导字符以将字符串填充到特定长度?

假设我想在字符串前面添加零,如果所述字符串短于 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)

shell string printf

7
推荐指数
2
解决办法
2万
查看次数

GNU find 的 -printf 谓词的 POSIX 替代方案

我想重写这 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需要更复杂的重定向。

find posix portability printf

7
推荐指数
1
解决办法
427
查看次数

zsh 用 printf '%.s' 打印完整字符串是一个错误吗?

该命令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)

shell zsh printf

7
推荐指数
1
解决办法
1145
查看次数

在 /usr/bin/printf 或 Bash printf 中按指定顺序处理参数

前言。我知道在该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 源代码国际化。如果没有这个功能,这是非常不可能的。

bash printf

7
推荐指数
2
解决办法
2939
查看次数

BASH 打印问题 (printf \\$(printf '%03o' $1))

我用下面要转换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)

linux bash ascii printf

7
推荐指数
2
解决办法
941
查看次数

为什么 printf 不转义换行符?

$ printf "hi"
hi$ printf "hi\n"
hi
$ printf "hi\\n"
hi
Run Code Online (Sandbox Code Playgroud)

为什么最后一行不打印hi\n

bash newlines printf

7
推荐指数
2
解决办法
3957
查看次数

可变格式的 Printf 格式 - 这个 var 引用了什么?

我正在 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)

那个变量引用在做什么?这是什么意思?

shell bash printf

6
推荐指数
1
解决办法
2万
查看次数

格式化的 shell 脚本输出

如何使用 修复输出宽度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)

shell-script printf text-formatting

6
推荐指数
3
解决办法
2万
查看次数