我观察到 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 变量替换时遇到问题。这是我正在尝试做的一个愚蠢的例子。我需要从 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 脚本来计算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)
我的问题是我希望所有三列都在同一行中。我怎样才能做到这一点?
当我给出像echo $PATH或 之类的命令时which program,我经常会得到一大块由 may 目录组成的文本块。这是相当无用的,例如,如果我想查看其中是否存在一条特定路径。
有没有办法将它们分开,以便每个条目都从新行开始?
输出不包括换行符,但我可以看到:我可以使用适当的分隔符。
我弄乱了 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)
那么现在反斜杠和感叹号显示。如何正确使用这个角色?我错过了什么?
在 zsh 中,以下 2 个命令的结果不同:
a=$(</etc/hosts) && echo $a
echo $(</etc/hosts)
Run Code Online (Sandbox Code Playgroud)
第一个逐行打印内容,而第二个将整个内容打印在一行中。
我猜是因为子shell将结果逐行返回给主echo进程,但我无法确认。
有人可以帮我清除吗?
假设您必须将其回显到文件中:
RZW"a4k6[)b!^"%*X6Evf
Run Code Online (Sandbox Code Playgroud)
你怎么做呢?
我要回显的实际“行”是 2048 个字符的行。
当我echo (ls)在 bash 中运行时,它返回:
-bash: syntax error near unexpected token `ls'
Run Code Online (Sandbox Code Playgroud)
我知道我应该转义括号或引用以获得纯文本输出。但是如果括号意味着在子shell环境中运行命令序列,结果对我来说仍然没有意义。
我的环境:bash 4.3(自制软件安装),OS X El Capitan
我有一个 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)
我想我在这里做的是。. .
_2015-11-12.pdf文件名的一部分)其结果显然是所有 base64 解码文件名的大字符串,每个名称由一个空字符分隔,整个字符串后跟一个换行符。该期望的结果将是对自身一行每个单独的解码文件名。
我尝试了各种技巧来尝试解决这个问题,但我还没有找到任何有效的方法。我试过... | base64 -d | echo,... | base64 -d && echo等,试图在沿途的各个点插入换行符。似乎到值结束时| base64 -d,它们都作为单个字符串同时处理。我试图找到一种方法将每个值base64 -d一次发送给一个,而不是作为文件名的整体列表。
我正在做一种黑客挑战,其中一部分发现我被困在一个只有很少命令的受限 shell 中。可用的命令之一是echo. 在我的头撞墙几个小时后,我决定在一些提示下达到顶峰。事实证明,这echo os.system('/bin/bash')会让你摆脱受限制的外壳......只有在我看到这个之后我才能用谷歌搜索它,但我没有找到任何关于它的信息,除了你可以在一些受限的环境中做到这一点壳的情况。当我用 zsh 和 bash 尝试它时,它在我的终端上不起作用......为什么这甚至有效?这os.system部分对我来说看起来像 Python .. 有人可以向我提供一些背景知识吗?如果这是 Python,它还能如何与 echo 一起使用?