标签: echo

为什么我观察到不同的回声行为?

我观察到 echo 的以下行为

#!/bin/bash

x=" hello"

echo $x
echo "$x"
Run Code Online (Sandbox Code Playgroud)

现在,当我运行上面的代码时,我得到

ronnie@ronnie:~$ bash test.sh
hello
 hello
ronnie@ronnie:~$
Run Code Online (Sandbox Code Playgroud)

所以,有人可以向我解释为什么whitespace在第一种情况下不存在于输出中,并且还指向我定义此行为的文档。

bash echo quoting

5
推荐指数
1
解决办法
520
查看次数

使用bash脚本输出新脚本:需要替换和不替换变量的混合

我在使用 bash 变量替换时遇到问题。这是我正在尝试做的一个愚蠢的例子。我需要从 bash 脚本输出一个新脚本。一行(参见echo我的示例)混合了不应替换的变量和应替换的变量。

#!/bin/bash
REPLACE=`whoami`
cat << EOF > mynewscript.sh
    read DONTREPLACE < /home/$REPLACE/localinput.txt
    echo $DONTREPLACE > /home/$REPLACE/somefile.log
EOF
exit 0
Run Code Online (Sandbox Code Playgroud)

这不是一个真实的例子,但它确实说明了问题。假设我需要提前知道绝对路径,并且我希望在我的原始脚本中评估 $REPLACE。但我不希望在我的脚本中评估/替换 $DONTREPLACE。$DONTREPLACE应该完全像新脚本一样输出。

因此,在制作 here 文档时引用“EOF”是行不通的。

我希望我能很好地解释这一点。

我不知道其他解决方案。我欣赏任何想法,但我更喜欢非常简单的想法/解决方案。它不必很优雅。

bash echo variable-substitution here-document

5
推荐指数
1
解决办法
6586
查看次数

Bash 脚本:在同一行中打印列数据

我编写了一个 bash 脚本来计算PostgreSQL数据库的大小,并将输出以及脚本在文本文件中执行的日期打印出来。脚本代码如下:

#!/bin/bash
date +"%d:%m" >> dbdata.growth
psql -h 192.168.2.173 -U postgres -c "select pg_database_size('ddb'); "  | sed -n    
'3,3p' | numfmt --to=iec >>dbdata.growth
psql -h 192.168.2.173 -U postgres -c "select pg_database_size('dpkidb'); "  | sed  
-n '3,3p' | numfmt --to=iec >>dbdata.growth
Run Code Online (Sandbox Code Playgroud)

该脚本以如下所示的格式生成以下输出

26:03
         134G
         4.4M
26:03
         134G
         4.4M
Run Code Online (Sandbox Code Playgroud)

我的问题是我希望所有三列都在同一行中。我怎样才能做到这一点?

scripting bash sed echo

5
推荐指数
1
解决办法
2004
查看次数

将返回的文本块拆分为终端中的行?

当我给出像echo $PATH或 之类的命令时which program,我经常会得到一大块由 may 目录组成的文本块。这是相当无用的,例如,如果我想查看其中是否存在一条特定路径。

有没有办法将它们分开,以便每个条目都从新行开始?

输出不包括换行符,但我可以看到:我可以使用适当的分隔符。

shell echo newlines

5
推荐指数
2
解决办法
2227
查看次数

使用 !回声中的字符

我弄乱了 echo 并且在 echo 显示 ! 特点。

我试过这个。

echo -e "Wake!\nUp!
bash: !\n!: event not found
Run Code Online (Sandbox Code Playgroud)

那么这个

# echo "Wake\!\nUp!"
Wake\!
Up!
Run Code Online (Sandbox Code Playgroud)

那么现在反斜杠和感叹号显示。如何正确使用这个角色?我错过了什么?

bash special-characters echo

5
推荐指数
1
解决办法
1440
查看次数

从 zsh 中的 subshel​​l 回显结果

在 zsh 中,以下 2 个命令的结果不同:

a=$(</etc/hosts) && echo $a
echo $(</etc/hosts)
Run Code Online (Sandbox Code Playgroud)

第一个逐行打印内容,而第二个将整个内容打印在一行中。

我猜是因为子shell将结果逐行返回给主echo进程,但我无法确认。

有人可以帮我清除吗?

zsh echo subshell

5
推荐指数
1
解决办法
1163
查看次数

用多个引号和关键字符(&amp;、$、! 等)回显某些内容

假设您必须将其回显到文件中:

RZW"a4k6[)b!^"%*X6Evf
Run Code Online (Sandbox Code Playgroud)

你怎么做呢?

我要回显的实际“行”是 2048 个字符的行。

shell-script echo quoting

5
推荐指数
2
解决办法
1332
查看次数

"echo (ls)" 在 bash 中有什么作用?

当我echo (ls)在 bash 中运行时,它返回:

-bash: syntax error near unexpected token `ls'
Run Code Online (Sandbox Code Playgroud)

我知道我应该转义括号或引用以获得纯文本输出。但是如果括号意味着在子shell环境中运行命令序列,结果对我来说仍然没有意义。

我的环境:bash 4.3(自制软件安装),OS X El Capitan

bash echo

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

如何解码 base64 编码的文件名列表?

我有一个 base64 编码的文件名列表,格式为{base64-encoded part here}_2015-11-12.pdf. 我正在尝试解码该文件列表并将其作为另一个列表在命令行上返回,以换行符分隔。这是我现在正在尝试的:

find . -name "*_*" -printf "%f\0" | sed 's/_....-..-..\.pdf//g' | xargs -0 -i echo "{}" | base64 -d
Run Code Online (Sandbox Code Playgroud)

我想我在这里做的是。. .

  1. 查找文件,仅打印出由空字符分隔的文件名(即去掉“./”前缀)
  2. 使用 sed 仅保留 base64 编码的部分(即,删除_2015-11-12.pdf文件名的一部分)
  3. 使用 xargs 表面上将每个文件名传递给 echo
  4. 然后解码 echo 返回的值。

其结果显然是所有 base64 解码文件名的大字符串,每个名称由一个空字符分隔,整个字符串后跟一个换行符。该期望的结果将是对自身一行每个单独的解码文件名。

我尝试了各种技巧来尝试解决这个问题,但我还没有找到任何有效的方法。我试过... | base64 -d | echo,... | base64 -d && echo等,试图在沿途的各个点插入换行符。似乎到值结束时| base64 -d,它们都作为单个字符串同时处理。我试图找到一种方法将每个值base64 -d一次发送给一个,而不是作为文件名的整体列表。

bash xargs echo base64

5
推荐指数
1
解决办法
5865
查看次数

为什么“echo os.system('/bin/bash')”有效?

我正在做一种黑客挑战,其中一部分发现我被困在一个只有很少命令的受限 shell 中。可用的命令之一是echo. 在我的头撞墙几个小时后,我决定在一些提示下达到顶峰。事实证明,这echo os.system('/bin/bash')会让你摆脱受限制的外壳......只有在我看到这个之后我才能用谷歌搜索它,但我没有找到任何关于它的信息,除了你可以在一些受限的环境中做到这一点壳的情况。当我用 zsh 和 bash 尝试它时,它在我的终端上不起作用......为什么这甚至有效?这os.system部分对我来说看起来像 Python .. 有人可以向我提供一些背景知识吗?如果这是 Python,它还能如何与 echo 一起使用?

python echo restricted-shell

5
推荐指数
1
解决办法
4182
查看次数