我有一串文本和空格,如下所示:
macOS windows arch-linux ubuntu_linux
我想将每个元素(元素之间用空格分隔)附加到 bash 数组中。该怎么做?
我有一串文本和空格,如下所示:
macOS windows arch-linux ubuntu_linux
我想将每个元素(元素之间用空格分隔)附加到 bash 数组中。该怎么做?
如果我们这样做:
VAR=100:200:300:400
我们可以做到:
echo ${VAR%%:*}
100
和
echo ${VAR##*:}
400
是否有任何等价物可以用来获取 200 和 300 的值?
例如,如果有超过 3 个冒号,是否有办法只获取第二个和第三个冒号之间的内容?
我知道 bash 非常努力地保持新版本与旧版本兼容。
然而他们有时会引入(虽然很小,但仍然)重大的变化:
例如,当我们不再拥有: { foo }
#现在挂起
但必须有: #即在结束前{ foo ;}
有一个或换行符;
}
(不确定哪个版本引入了这一点,那是 20 多年前的事了 ^^)
我的问题是:如何找出在整个 bash 更新历史中发生了哪些其他“重大”变化?
也许我漏掉了,但我没有找到cd ''
应该成功的文档。由于没有名为 的目录''
,所以显然应该失败。例如,
mydir=
cd -- "$mydir" || exit 1 # succeeds!!
echo wrong
好像有一百万个脚本里都有 bug,随时可能出现。这算不算是某种向后兼容的 bug?难道我每次都要单独检查变量名是否为空吗cd
?顺便说一句,shellcheck
我也没发现这个问题。
我有自己的 Redis 服务器实现,我想通过 shell 脚本对其进行测试。
一般的想法是通过 向它提供一些命令nc
,并且由于nc
将我的程序的输出(响应)打印到stdout
,因此在脚本变量中捕获响应并将其与预期输出进行比较。
我无法让它工作,我不知道问题是什么以及如何解决它。
这是脚本的一部分:
#!/bin/bash
set -eu
PORT=6380;
RUST_LOG=info ./run.sh --port $PORT 2>/dev/null & sleep 1; # Give it some time to start.
i=0;
i=$((i+1)); printf 'Running test #%d...' "$i";
response=$(printf "*1\r\n\$4\r\nPING\r\n" | nc localhost $PORT);
if [ "$response" = '+PONG\r\n' ]; then
printf ' PASSED'
else
printf ' FAILED\nGot:\n%s\n\n' "$response"
fi;
sleep 0.1;
pkill redis-server;
这只是测试的一个示例。当用户发送PING
命令时,预期的响应是PONG
,但它被编码并发送回+PONG\r\n
。
本次测试运行的 CLI 输出($ ./test.sh
)为:
Running test #1... FAILED
Got:
+PONG
因此,看起来该变量$response
确实包含了它应该包含的内容。
我尝试从参考输出中删除、、,但没有成功,只是想看看是否有+
帮助\r
。\n
\r\n
我将在响应中进行更复杂的测试,其中包括需要转义的字符($
),例如。\$5\r\nHello
顺便说一句,手动设置response
可以按预期工作。
response='+PONG\r\n';
if [ "$response" = '+PONG\r\n' ]; then
echo Equal
else
echo Different
fi;
正如预期的那样,这将打印Equal
。
通过 添加调试输出后set -ex
,我可以看到$response
存储+PONG\r
,即没有\n
。
Running test #1...++ printf '*1\r\n$4\r\nPING\r\n'
++ nc localhost 6380
+ response=$'+PONG\r'
+ '[' $'+PONG\r' = '+PONG\r\n' ']'
+ printf ' FAILED\nGot:\n%s\n\n' $'+PONG\r'
FAILED
Got:
+PONG
好的,那么设置参考输出+PONG\r
应该可以工作,对吗?
Running test #1...++ printf '*1\r\n$4\r\nPING\r\n'
++ nc localhost 6380
+ response=$'+PONG\r'
+ '[' $'+PONG\r' = '+PONG\r' ']'
+ printf ' FAILED\nGot:\n%s\n\n' $'+PONG\r'
FAILED
Got:
+PONG
显然不是。
我尝试像这样包装:response
,但没有成功。{}
if [ "${response}" = '+PONG\r' ]; then
我错过了什么?
我也很好奇想知道是怎么迷路的以及为什么\n
迷路。
zsh
如果需要注意的话,我是在 Mac 上运行它的,但是系统明确告诉它使用bash
。
如果我ps -p $$
从测试脚本执行,我会得到51547 ttys003 0:00.02 /bin/bash ./test.sh
。
让我们定义一个 shell 函数(这里的 shell 是 Bash)并测试它
$ s () { xterm -e sleep 5 & }
$ s
[1] 307926
$
[1]+ Done xterm -e sleep 5
$
根据我对更好的具体理解,我可以s
像这样重新定义
$ s () { xterm -e sleep 5 & disown ; }
$ s
[1] 307932
$
$
(作业完成时,shell 没有发出任何消息)。
在这里,我不得不问,是否可以定义,s
以便我有
$ s () { pre_magic xterm -e sleep 5 post_magic ; }
$ s
$
$
即,抑制 shell 在终端上打印的作业信息?
bash 命令:
$(System.DefaultWorkingDirectory)/yq_linux_amd64 '. *= load("${{ parameters.HELM_CHART_PATH }}/values/DEV/${{ parameters.COMPONENT }}.yaml")' ${{ parameters.HELM_CHART_PATH }}/values/global-values.yaml > $(System.DefaultWorkingDirectory)/deployment-values.yaml
正在合并两个 YAML 文件中的值,并将合并后的输出发送到单个文件。我无法理解从第一个单引号到输出重定向的语法。有人能帮我理解一下这是什么意思吗?
为什么两个操作数都在运算符后面,也就是*=
?.
是当前目录,但是 ? 之前是什么意思呢*=
?
另外,为什么只有第一个操作数介于之间load ()
,其含义是什么?
在 Bash 中,检查环境变量是否设置的标准方法是什么?我对以下选项有点困惑:
! [ -z "${VAR}" ]
[ -n "${VAR}" ]
[ "${VAR}" ]
或者有更好的方法吗?
我有一条BASH
管道,它在某个时刻运行一个具有奇点执行的Singularity
容器,如下所示:
singularity exec --bind `pwd`:/folder --bind $d:/results <image>.sif <tool_command> -i /folder/<file>.fastq -v /results/<output>/<file>.vcf -r /folder/<reference>.fna -s <vcf_sample_name> -j 24 -t 24 -o /results/<output_file_suffix>
由于我使用数组同时运行多个实验,因此我正在使用希望添加到的环境变量重新定义实验<output_file_suffix>
;它适用于管道的所有步骤,但Singularity
似乎无法看到我在脚本中定义的变量......
有人能提供一些建议吗?我查了一下,但--env
似乎行不通。提前谢谢!