命令替换有两种语法:美元括号和反引号。运行top -p $(pidof init)并top -p `pidof init`给出相同的输出。这两种做同样事情的方式,还是有区别?
我有一个将数据输出到 stdout ( command1 -p=aaa -v=bbb -i=4)的命令。输出行可以具有以下值:
rate (10%) - name: value - 10Kbps
Run Code Online (Sandbox Code Playgroud)
我想 grep 该输出以存储该“速率”(我想管道在这里会很有用)。最后,我希望该速率是第二个命令的参数值(假设command2 -t=${rate})
我这边看起来很棘手;我想更好地了解如何使用管道、grep、sed 等。
我已经尝试了很多这样的组合,但我对这些感到困惑:
$ command1 -p=aaa -v=bbb -i=4 | grep "rate" 2>&1 command2 -t="rate was "${rate}
Run Code Online (Sandbox Code Playgroud) 在我的 Bash 环境中,我使用包含空格的变量,并在命令替换中使用这些变量。
引用我的变量的正确方法是什么?如果这些是嵌套的,我该怎么做?
DIRNAME=$(dirname "$FILE")
Run Code Online (Sandbox Code Playgroud)
或者我在替换之外引用?
DIRNAME="$(dirname $FILE)"
Run Code Online (Sandbox Code Playgroud)
或两者?
DIRNAME="$(dirname "$FILE")"
Run Code Online (Sandbox Code Playgroud)
还是我使用反引号?
DIRNAME=`dirname "$FILE"`
Run Code Online (Sandbox Code Playgroud)
这样做的正确方法是什么?以及如何轻松检查报价是否正确?
我想为日志文件名中包含当前小时的 cron 脚本创建一个日志文件。这是我尝试使用的命令:
0 * * * * echo hello >> ~/cron-logs/hourly/test`date "+%d"`.log
Run Code Online (Sandbox Code Playgroud)
不幸的是,我在运行时收到此消息:
/bin/sh: -c: line 0: unexpected EOF while looking for matching ``'
/bin/sh: -c: line 1: syntax error: unexpected end of file
Run Code Online (Sandbox Code Playgroud)
我曾尝试date以各种方式逃避该部分,但运气不佳。是否可以在 crontab 文件中内嵌进行此操作,或者我是否需要创建一个 shell 脚本来执行此操作?
#!/bin/bash
function0()
{
local t1=$(exit 1)
echo $t1
}
function0
Run Code Online (Sandbox Code Playgroud)
echo打印空值。我期望:
1
Run Code Online (Sandbox Code Playgroud)
为什么t1变量没有被分配退出命令的返回值 - 1?
我有一个名为 links.txt 的文本文件,它看起来像这样
link1
link2
link3
Run Code Online (Sandbox Code Playgroud)
我想逐行遍历这个文件并对每一行执行一个操作。我知道我可以使用 while 循环来做到这一点,但由于我正在学习,我想使用 for 循环。我实际上使用了这样的命令替换
a=$(cat links.txt)
Run Code Online (Sandbox Code Playgroud)
然后像这样使用循环
for i in $a; do ###something###;done
Run Code Online (Sandbox Code Playgroud)
我也可以做这样的事情
for i in $(cat links.txt); do ###something###; done
Run Code Online (Sandbox Code Playgroud)
现在我的问题是当我在变量 a 中替换 cat 命令输出时,link1 link2 和 link3 之间的换行符被删除并被空格替换
echo $a
Run Code Online (Sandbox Code Playgroud)
产出
链接1 链接2 链接3
然后我使用了 for 循环。当我们执行命令替换时,是否总是用空格替换新行?
问候
我正在尝试命令
$ b=5; echo `$b`;
-bash: 5: command not found
Run Code Online (Sandbox Code Playgroud)
但它没有像预期的那样打印 5。我在这里缺少什么?
`(反引号/反引号)在命令中是什么意思?似乎说`评估其中的命令并用输出替换它们。
超过 3.5K 票的StackOverflow答案具有用于分配给DIR当前 bash 脚本目录的单行:
DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
Run Code Online (Sandbox Code Playgroud)
我对嵌套的双引号感到困惑。据我所知,以下片段是双引号的:
"$( cd "
"${BASH_SOURCE[0]}"
" && pwd )"
Run Code Online (Sandbox Code Playgroud)
...以及=(即$( dirname和))右侧的所有其他内容均未加引号。换句话说,我假设第 2、第 4 和第 6 个"字符分别“关闭”第 1、第 3 和第 5 个"字符。
我明白双引号的作用"${BASH_SOURCE[0]}",但是另外两对双引号的目的是什么?
另一方面(尽管投票得分很高),如果上面的片段不正确,那么实现其名义意图的正确方法是什么?
(名义意图我的意思是:将pwdfirst cd-ing后返回的值收集到 返回的目录中dirname "${BASH_SOURCE[0]}",并cd在子 shell 中执行-ing,以便$PWD父 shell 的 保持不变)。
for k in {0..49};
do
a=$(($((2*$k))+1));
echo $a;
done
Run Code Online (Sandbox Code Playgroud)
Hi, I need a simplified expression for the third line, maybe one that does not use command substitution.
我知道我可以通过多种方式解决这个问题,但我想知道是否有办法只使用 bash 内置函数来解决这个问题,如果没有,最有效的方法是什么。
我有一个包含类似内容的文件
AAA
B C DDD
FOO BAR
Run Code Online (Sandbox Code Playgroud)
我只是指它有几行,每行可能有也可能没有空格。我想运行一个命令
cmd AAA "B C DDD" "FOO BAR"
Run Code Online (Sandbox Code Playgroud)
如果我使用cmd $(< file)我得到
cmd AAA B C DDD FOO BAR
Run Code Online (Sandbox Code Playgroud)
如果我使用cmd "$(< file)"我得到
cmd "AAA B C DDD FOO BAR"
Run Code Online (Sandbox Code Playgroud)
如何让每一行都处理一个完全相同的参数?