bash 相关问题

有关为Bash命令shell编写的脚本的问题。对于有错误的shell脚本,请在发布此处之前使用shellcheck程序(或在https://shellcheck.net上的Web shellcheck服务器中)进行检查。关于交互式使用Bash的问题更可能是超级用户的主题,而不是Stack Overflow。

使用“sleep infinity”时无法捕获 SIGINT 和 SIGTERM

我的示例代码: #!/bin/bash LOGFILE =“/tmp/example.log” 清理函数(){ echo "脚本被 SIGINT 中断,正在清理..." >> $LOGFILE 出口0 }

回答 1 投票 0

使用已知元素查找父元素的属性

不确定标题是否清楚,但基本上我有一些如下所示的XML: 测试1 不确定标题是否清楚,但基本上我有一些如下所示的 XML: <details> <result id=1234567890> <name>Test1</name> </result> <result id=5345345433> <name>Test2</name> </result> <result id=9572385354> <name>Test3</name> </result> 我想要完成的是找到使用已知值的 id 属性 即测试1 > 1234567890,测试2 > 5345345433,测试3 > 9572385354 最好使用 xmllint,但 xmlstarlet 也是一个选项。 输入 首先,您的 XML 无效。你的id属性需要被qouted,并且详细信息没有关闭。这是修改后的输入: <details> <result id="1234567890"> <name>Test1</name> </result> <result id="5345345433"> <name>Test2</name> </result> <result id="9572385354"> <name>Test3</name> </result> </details> 结果 下面将使用 xmlstarlet 提取给定 name 属性的特定 id。 xmlstarlet sel -t -c "/details/result[name='Test1']" test.xml | grep -Po "(?<=id=\")[\d]*" 这会回来 1234567890 您也可以将命令中的 Test1 替换为变量。 var=Test1 xmlstarlet sel -t -c "/details/result[name='$var']" test.xml | grep -Po "(?<=id=\")[\d]*" 故障 xmlstarlet sel -t -c "/details/result[name='$var']" test.xml 选择结果中与 $var 匹配的所有名称标签。 | grep -Po "(?<=id=\")[\d]*" 使用 Perl Regex 将输出通过管道传输到 grep 以查找 id 属性并打印所有包含的数字。 您还可以使用xmllint: xmllint --xpath "string(/details/result[name='Test1']/@id)" yourfile.xml --xpath:告诉 xmllint 使用 xpath 语法进行选择。 xpath选择器的详细信息: string(/details/result[name='Test1']/@id) string():制作字符串 /details/result:选择result元素的details子元素 [name='Test1']:包含一个name节点,其值为Test1 /@id:id属性值(result元素) 也许一个简单的 grep 和 awk 解决方案适合您。 grep -B1 Test1 sample.xml | awk '/id=/{gsub(/[^0-9]+/, "", $0); print $0 }' 完整回答OP的问题, #/bin/bash # # how to use xmllint to get information from specific elements # REQUIRES libxml2 (sorry Snow Leopard!) mytestxml=' <details> <result id="1234567890"> <name>Test1</name> </result> <result id="5345345433"> <name>Test2</name> </result> <result id="9572385354"> <name>Test3</name> </result> </details> ' echo Test Document is :"$mytestxml" echo Get the contents of the \''id'\' attribute of a specific \''result'\' element query=\''string(/details/result[3]/@id)'\' echo xpath query is "$query" myresult=$(echo "$mytestxml" | xmllint --xpath 'string(/details/result[3]/@id)' - ) echo info returned is "$myresult" echo "" echo Get the specific \''result'\' node whose \''name'\' element is \"Test1\" query=\''/details/result[name="Test1"]'\' echo xpath query is "$query" myresult=$(echo "$mytestxml" | xmllint --xpath '/details/result[name="Test1"]' - ) echo info returned is "$myresult" echo "" echo Get the \''id'\' attribute of the specific \''result'\' node whose \''name'\' element is \"Test1\" query=\''string(/details/result[name="Test1"]/@id)'\' echo combined xpath query is "$query" myresult=$(echo "$mytestxml" | xmllint --xpath 'string(/details/result[name="Test1"]/@id)' - ) echo info returned is "$myresult" 获取特定“result”元素的“id”属性的内容。 xpath 查询是: 'string(/details/result[3]/@id)' 返回的信息是:9572385354 获取'name'元素为“Test1”的特定'result'节点 xpath 查询是: '/details/result[name="Test1"]' 返回的信息是: <result id="1234567890"> <name>Test1</name> </result> 获取'name'元素为“Test1”的特定'result'节点的'id'属性 组合的 xpath 查询是: 'string(/details/result[name="Test1"]/@id)' 返回的信息是1234567890 希望这对找到此页面的其他人有用。 :o) 这样的东西应该与 xmlstarlet 一起使用(对我有用): xmlstarlet sel --template --match "/details/result[name='Test1']" --value-of "@id" test.xml

回答 5 投票 0

bash:数字时钟模式

我喜欢数字时钟。我想知道:一条街道有多少种不同的数字模式? 例如01:23:45 .. 23:54:10 在 bash 中提供一个很酷的实现,也带有实用程序! 我的出发点是: 我=0 夫...

回答 1 投票 0

Git 推送错误 - 无法将一些参考推送到 <path>

我正在尝试将代码上传到我在 github 上创建的存储库,但出现错误。 假设存储库的 URL 是 https://github.com/a,我该如何将代码上传到远程

回答 3 投票 0

如何更改Linux中的默认shell? [已关闭]

如何更改默认外壳? env 命令当前显示: 外壳=/bin/tcsh 我想将其更改为 Bash。

回答 3 投票 0

删除仅更新文件中时间戳的所有提交

我有一个 git 存储库,我是唯一的贡献者,并且该存储库的分叉为零。这意味着我可以在变基和强制推送方面做任何我想做的事情。 存储库有 22503

回答 1 投票 0

如何获取 bash 来源的所有文件的列表?

有没有办法找出 bash 来源的所有文件? 或者,是否有一个单一入口点(或第一个入口点),我可以通过...

回答 4 投票 0

在 crontab 中的 bash 脚本中执行 gcloud 命令时出错

我写了一个bash脚本,使用 用于激活服务帐户的 gcloud 命令和 gsutil 命令将文件移动到 GCS 存储桶。 当我使用 bash 命令运行脚本时,它执行得很好。但是当我

回答 1 投票 0

正确转义要在 Jenkins jq 脚本中使用的环境变量

我有以下 JSON: { “默认选项”:{ “环境变量条目”:[ { “密钥”:“操作系统版本”, “值”:&q...

回答 1 投票 0

使用输出重定向来更改目录

我正在使用 BASH 并使用输出重定向将目录路径保存到文件。当我尝试使用输入重定向重新使用存储在文件中的输入时,它不起作用。 我写了2个函数...

回答 1 投票 0

创建目录时权限被拒绝以及如何为目录中的每个文件添加.exe后缀

我想创建一个目录,例如source_dir,并在该目录中添加一些没有内容的虚拟文件,如file1.txt、file2.sh等 现在我想创建另一个目录,例如destination_dir 和...

回答 1 投票 0

如何在 GitHub Actions 的运行步骤 (bash) 中保留带双引号的输入?

这个问题是 GitHub Actions 挑战,但据我所知,我可能应该用运行命令(bash)来解决。 背景 我有一个 json 文件(见下文)来自动填充我的

回答 1 投票 0

BASH 变量和curl

有人可以帮助我理解为什么第二个命令按预期工作,但第一个命令却不能。 # 第一的 SESSION=$(curl http://172.21.0.4:4444/status 2>&1 | grep sessionId | cut -d &quo...

回答 1 投票 0

高效查找服务启动的多个进程的PID

我有一个包含许多服务名称的文件,其中一些正在运行,其中一些没有。 foo.service 酒吧服务 巴兹服务 我想找到一种有效的方法来获取正在运行的进程的PID...

回答 3 投票 0

在 Bash 循环内递增变量

我正在尝试编写一个小脚本来计算日志文件中的条目数,并且我正在递增一个变量(USCOUNTER),我在循环完成后尝试使用该变量。 但就在那一刻 USCOUNTER...

回答 8 投票 0

如何让grep用NULL字符分隔输出?

假设我们正在对一堆文件进行多行正则表达式模式搜索,并且我们想要从 grep 中提取匹配项。默认情况下,grep 输出由换行符分隔的匹配项,但由于我们正在做

回答 4 投票 0

如何正确地在数组中进行“不等于”字符串比较,然后在bash中删除该元素

我正在尝试对数组中每个字符串元素的最后三个字符进行 != 字符串比较,然后如果不相等则删除该元素,但它没有产生预期的结果...

回答 1 投票 0

如何在静默模式下使用dpkg

我尝试在运行脚本之前测试脚本中是否安装了某些软件包。 通过 dpkg 命令来做到这一点。这是我的代码: dpkg -s 对话框 对话框状态=$? 如果[“$dialogStatut”-eq 1];然后 //

回答 3 投票 0

bash:条件语句导致 macOS 上出现“意外的文件结尾”

当我在 macOS (Sonoma 14.4.1) 上的 bash shell 中获取以下简单脚本时,我得到 “语法错误:意外的文件结尾”。 #!/bin/bash 回声“你好” 回显“$SHELL”...

回答 1 投票 0

将 json 输出导出到环境变量,Bash 中缺少逗号

[{ "Availab]ilityZone": "ap-east-1a" “描述”:“AWS_FOO” “组”:[ { “组名”:“AWS_FOO” ”

回答 1 投票 0

© www.soinside.com 2019 - 2024. All rights reserved.