我刚刚编写了以下 bash 脚本来检查 Linux 机器列表上的 ping 访问:
for M in $list
do
ping -q -c 1 "$M" >/dev/null
if [[ $? -eq 0 ]]
then
echo "($C) $MACHINE CONNECTION OK"
else
echo "($C) $MACHINE CONNECTION FAIL"
fi
let C=$C+1
done
Run Code Online (Sandbox Code Playgroud)
这打印:
(1) linux643 CONNECTION OK
(2) linux72 CONNECTION OK
(3) linux862 CONNECTION OK
(4) linux12 CONNECTION OK
(5) linux88 CONNECTION OK
(6) Unix_machinetru64 CONNECTION OK
Run Code Online (Sandbox Code Playgroud)
如何printf在我的 bash 脚本中使用(或任何其他命令)来打印以下格式?
(1) linux643 ............ CONNECTION OK
(2) linux72 ............. CONNECTION OK …Run Code Online (Sandbox Code Playgroud) 我想输出hello world超过 20 个字符。
printf "%-20s :\n\n" 'hello world!!'
# Actual output
hello world!! :
# Wanted output
hello world!!========:
Run Code Online (Sandbox Code Playgroud)
但是,我不想用空格来完成,而是用“ = ”来代替。我怎么做?
我正在编写一个星座 RSS 脚本作为 Unix/Linux 项目的介绍,但遇到了一个问题,我的教授无法在我下课后留下来解决这个问题。由于我无法弄清楚如何使用实际日期作为要检查的内容,因此我想通过让用户输入为 MMDD 格式的标准数字来尝试基本算术。据他说,该脚本似乎将输入读取为八进制代码而不是整数。这是脚本的示例:
elif [ "$olddate" -gt 1121 ] && [ "$olddate" -lt 1131 ] || [ "$olddate" -gt 1200 ] && [ "$olddate" -lt 1222 ]
then
echo "You are Sagittarius"
exit
elif [ "$olddate" -gt 1221 ] && [ "$olddate" -lt 1232 ] || [ "$olddate" -gt 0100 ] && [ "$olddate" -lt 0120 ]
then
echo "You are Capricorn"
exit
Run Code Online (Sandbox Code Playgroud)
这是最基本的,我拿出了RSS部分。“olddate”是我阅读提示中的预期输入。虽然 1121 到 1131、1200 到 1222 和 0100 到 0120 有效,但 1221 到 …
有一个脚本(我们称之为echoer)可以打印以筛选一堆信息。我希望只能在找到模式后才能看到线条。
我想象使用解决方案看起来像
echoer | solution_command <pattern>
Run Code Online (Sandbox Code Playgroud)
理想情况下pattern是一个正则表达式,但硬值字符串对我来说就足够了。
在 shell 脚本中...
如何在不剥离任何尾随换行符的情况下将 stdin 捕获到变量?
现在我已经尝试过:
var=`cat`
var=`tee`
var=$(tee)
Run Code Online (Sandbox Code Playgroud)
在所有情况下$var都不会有输入流的尾随换行符。谢谢。
另外:如果输入中没有尾随换行符,则解决方案不得添加.
根据接受的答案更新:
我在代码中使用的最终解决方案如下:
function filter() {
#do lots of sed operations
#see https://github.com/gistya/expandr for full code
}
GIT_INPUT=`cat; echo x`
FILTERED_OUTPUT=$(printf '%s' "$GIT_INPUT" | filter)
FILTERED_OUTPUT=${FILTERED_OUTPUT%x}
printf '%s' "$FILTERED_OUTPUT"
Run Code Online (Sandbox Code Playgroud)
如果您想查看完整代码,请查看expandr的 github 页面,这是我为信息安全目的开发的一个小的开源git 关键字扩展过滤器shell 脚本。根据.gitattributes文件(可以是特定于分支的)和git config 中设置的规则,无论何时检入或检出存储库,git 都会通过expandr.sh shell 脚本通过管道传输每个文件。(这就是为什么保留任何尾随换行符或缺少换行符至关重要。)这使您可以清理敏感信息,并为测试、暂存和实时分支交换不同的环境特定值集。
我正在printf我的系统上测试两种不同的实现:printf (GNU coreutils) 8.26,以及与zsh 5.3.1. 我正在测试半数是如何四舍五入的,即 1.5、2.5、3.5、... 9.5。
$ for i in {1..9}; do /usr/bin/printf '%.0f\n' "${i}.5"; done
2
2
4
4
6
6
8
8
10
$ for i in {1..9}; do printf '%.0f\n' "${i}.5"; done
2
2
4
4
6
6
8
8
10
Run Code Online (Sandbox Code Playgroud)
在这里,两者显然都是半圆的。但是,当我测试四舍五入到第一个小数位时,事情变得混乱。也就是说,我正在测试 1.15、1.25、1.35、... 1.95。
$ for i in {1..9}; do /usr/bin/printf '%.1f\n' "1.${i}5"; done
1.1
1.2
1.4
1.5
1.5
1.6
1.8
1.9
2.0
$ for i in …Run Code Online (Sandbox Code Playgroud) 我正在尝试将零填充到一个数字
a=010
printf "%04d" $a
0008
Run Code Online (Sandbox Code Playgroud)
我需要“输出”为“0010”,它正在转换值。
甚至尝试排版
a=010
typeset -RZ2 a
echo $a
Run Code Online (Sandbox Code Playgroud)
当我在脚本中使用它时,出现以下错误:
Invalid -R option
Run Code Online (Sandbox Code Playgroud) $ printf "%s" a b
ab$ printf "%s%s" a b
ab
Run Code Online (Sandbox Code Playgroud)
我在理解printf. 如果我是对的,它与 C 编程语言中的字符串大致相同。
为什么格式说明符%s将以下两个字符串连接在一起?
为什么不 %s意味着只有一个字符串来替代它,而忽略剩余的字符串?
为什么两个字符串下%s和下%s%s的结果相同?
我了解如何使用 awk 的 printf 函数,但我不想指定每个字段。
例如,假设这是我的文件:
c1|c2|c3|c4|c5
c6|c7|c8|c9|c10
c11|c12|c13|c14|c15
Run Code Online (Sandbox Code Playgroud)
我想格式化它,以便每条记录的第一个字段都是 c11 的宽度——第一个字段中最长的单元格:
c1 |c2|c3|c4|c5
c6 |c7|c8|c9|c10
c11|c12|c13|c14|c15
Run Code Online (Sandbox Code Playgroud)
我知道我可以指定:
awk -F"|" '{printf "%-3s%s%s%s%s\n", $1, $2, $3, $4, $5}' file > newfile
Run Code Online (Sandbox Code Playgroud)
假设我知道我想要第一列的宽度是多少,但我不知道文件中有多少个字段。基本上我想做类似的事情:
... '{printf "%-3s|", $1}'
Run Code Online (Sandbox Code Playgroud)
...然后以原始格式打印其余字段。
我创建了这个函数,它打印输出,如示例图像中所示。但是,这个功能的实现似乎太复杂了。
有什么方法可以改进它或实施替代解决方案吗?

#!/bin/bash
function box_out() {
input_char=$(echo "$@" | wc -c)
line=$(for i in `seq 0 $input_char`; do printf "-"; done)
# tput This should be the best option. what tput does is it will
# read the terminal info and render the correctly escaped ANSI code
# for you.
# Code like \033[31m will break the readline library in some of the
# terminals.
tput bold
line="$(tput setaf 3)${line}"
space=${line//-/ }
echo " ${line}"
printf '|' ; echo -n …Run Code Online (Sandbox Code Playgroud)