我正在尝试使用 printf 输出我的 shell 脚本的结果。为了保持列中的结果对齐,我使用选项卡作为:
printf "%s\t %s\t %s\t %s\t %s\t %s\t %s\n" $i $est $var_m $jk $mst $var_M $Tes >>tmp
Run Code Online (Sandbox Code Playgroud)
但问题是,在某些情况下,结果有点长,比如输出,
var_M=`echo "scale=8;(-1/$jk + (e(2*$jk)+1)/(e(2*$jk)-1))"|bc -l `
Run Code Online (Sandbox Code Playgroud)
所以,如果我可以格式化打印到列,对我来说会更好,比如:
printf "%s *goto column 20* %s *go to column 30* " $i $est >>tmp
Run Code Online (Sandbox Code Playgroud)
这可能吗?
我已经检查了这个线程和手册页,但没有找到它。这可能吗?
注意:我没有任何特别的理由坚持使用 printf。因此,也欢迎任何其他可以(轻松)完成此操作的合适命令。
编辑:尝试过:printf "%-2s %-8s\n" $i $est >>tmp
这显然不工作:
4.0 0.17169E-02
5. 0.17156E-02
10. 0.17129E-02
Run Code Online (Sandbox Code Playgroud)
(第二行/第二列没有对齐,就像列表格式输出的情况一样)
我在vi. 我的输出运行到它下面的行中。我是 UNIX 的新手,所以我正在努力学习。我的输出使用printf.
printf "%-15s %15s %15s %2d\n %2s " $name $days $phone $start $time
Run Code Online (Sandbox Code Playgroud)
例如,输出看起来像这样
name days phone start
time name days phone start
time name days phone start
etc...
Run Code Online (Sandbox Code Playgroud)
如何让我的所有五个变量都打印在同一行上?
我的程序是
#!/bin/sh
printf 'Please enter salary amount: '
read salary
TAX="echo $salary * 0.15 | bc"
NET="echo $salary + $TAX | bc"
printf "Net Salary= %.2f" $NET
printf "\n"
Run Code Online (Sandbox Code Playgroud)
但是无论我尝试什么,我都无法得到我期望的输出。现在我得到
$ . 3_net_salary.sh
Please enter salary amount: 300
-bash: printf: echo: invalid number
-bash: printf: +: invalid number
-bash: printf: echo: invalid number
-bash: printf: 1_simple.awk: invalid number
-bash: printf: 1_simple_awk.sh: invalid number
-bash: printf: 2_simple_awk.sh: invalid number
-bash: printf: 2_simple_before.awk: invalid number
-bash: printf: 3_net_salary.sh: invalid number
-bash: printf: …Run Code Online (Sandbox Code Playgroud) 我将问题简化为(我相信)最简单的情况。假设我有一个myscript.sh包含以下内容的脚本:
#!/bin/bash
IFS='%20'
echo "$*"
Run Code Online (Sandbox Code Playgroud)
如果我按如下方式运行命令,输出将如下所示:
me@myhost ~ $ ./myscript.sh fee fi fo fum
fee%fi%fo%fum
Run Code Online (Sandbox Code Playgroud)
这是预期的行为,如bash手册页中所述:
* Expands to the positional parameters, starting from one. When
the expansion occurs within double quotes, it expands to a sin-
gle word with the value of each parameter separated by the first
character of the IFS special variable. That is, "$*" is equiva-
lent to "$1c$2c...", where c is the first character of the value
of the IFS variable. …Run Code Online (Sandbox Code Playgroud) 我有以下printf功能:
$ printf '%s %s %s\t%s\n' 100644 blob 8e1e f1.txt 100644 blob 9de7 f2.txt | git mktree
Run Code Online (Sandbox Code Playgroud)
谁能解释一下它产生了什么以及为什么?我希望%s每个参数字符串都有相同数量的格式选项,但我这里有更多的参数字符串。
我目前正在寻找以下代码的替代方案,该代码的工作方式不那么“不稳定”。
printf "Please enter the ticket number:\t"; read vTICKET; vTICKET=$(printf %04d "$vTICKET"); printf "$vTICKET\n";
Run Code Online (Sandbox Code Playgroud)
如果我输入072作为输入,这就是我看到的
Please enter the ticket number: 072
0058
Run Code Online (Sandbox Code Playgroud)
我想知道是否有另一种方法可以让我对输入或read命令更加宽容?printf似乎是在不实际测试字符串长度的情况下添加前导零的酷方法。
以下变量包括例如这个值
echo $SERVERS
server1,server2,server3,server4,server5
Run Code Online (Sandbox Code Playgroud)
当我想在不同的线路上用管道输送它们时,我会执行以下操作
echo $SERVERS | tr ',' '\n'
server1
server2
server3
server4
server5
Run Code Online (Sandbox Code Playgroud)
现在我想添加另一个管道( echo $SERVERS | tr ',' '\n' | ..... ),以打印以下预期结果
1 ……………… server1
2 ………………… server2
3 ………………… server3
4 ………………… server4
5 ………………… server5
6 ……………… server6
7 ………………… server7
8 ………………… server8
9 ………………… server9
10 ………………… server10
11 ………………… server11
12 ………………… server12
Run Code Online (Sandbox Code Playgroud)
不知道怎么做,但可能与nc命令 os 类似
有什么建议吗?
我正在尝试打印一些像这样输入的 unicode 代码
echo 0024 0025 | xargs -n1 echo # one code per line
| xargs printf '\u%s\n'
Run Code Online (Sandbox Code Playgroud)
希望得到这个
$
%
Run Code Online (Sandbox Code Playgroud)
但这就是我得到的
printf: missing hexadecimal number in escape
Run Code Online (Sandbox Code Playgroud)
经过一些试验和错误,我实际上有两个较小的问题,一种是有道理的,另一种似乎完全是个谜。
问题1:
echo 0024 0025 | xargs -n1 echo # one code per line
| xargs printf '\u%s\n'
Run Code Online (Sandbox Code Playgroud)
给我这个
-bash: printf: missing unicode digit for \u
\u0024
-bash: printf: missing unicode digit for \u
\u0025
Run Code Online (Sandbox Code Playgroud)
问题2:
$
%
Run Code Online (Sandbox Code Playgroud)
(使用>for$以便您可以$在输出中看到)
出于某种原因,有些字符适用于 exe 版本,但有些字符即使使用内置 printf 也适用。
所以这里有一个解决方法,如果不是问题#2,它会起作用(但可能比我原来的想法慢很多) …
我正在尝试在 bash 中创建一个表 - 我已将所有标题收集到一个 var 中 - 但是当我打印这些包含在 "'s 中的字符串时,这些字符串被视为新列,而不是 printf 命令
当我直接传递相同的值时,它工作正常,但是当我使用 $var 时,我得到了不同的行为。
$ printf '%-20s' "some spaced words" other values; echo -e "\n"
some spaced words other values
$ values='"some spaced words" other values'
$ echo $values
"some spaced words" other values
$ printf '%-20s' $values; echo -e "\n"
"some spaced words" other values
Run Code Online (Sandbox Code Playgroud)
我显然误解了我的变量如何不同< some string >,因此导致不同的行为。
使用变量时如何获得与输出 1 匹配的输出?
编辑:我可以看到 var 版本有引号 - 有没有办法将带引号的字符串作为变量传递给 printf ?
零的 ASCII 十六进制代码是 0x30。因此,您可以通过执行 打印零printf '\x30',它会打印零。
如果将其放入名为 myScript.sh 的 shell 脚本中,然后执行./myScript.sh,它也会打印一个零。
但是,如果您执行sh -c printf '\x30'或 ,sh myScript.sh,您将获得文字字符“\x30”,而不是将其解释为单个字节。
这是为什么?
(已在多台机器上观察到行为,我认为所有这些机器都在运行 bash)。
printf ×10
bash ×7
shell ×3
shell-script ×3
awk ×1
bash-script ×1
columns ×1
dash ×1
echo ×1
input ×1
nc ×1
numeric-data ×1
sed ×1
unicode ×1