Questions tagged «bash-scripting»

Bash脚本正在使用Bash Shell语言制作脚本。


8
抑制echo命令的执行跟踪?
我正在运行Jenkins的shell脚本,该脚本使用shebang选项启动了shell脚本#!/bin/sh -ex。 根据Bash Shebang所说的假人?,-x“导致外壳程序打印执行跟踪”,这对大多数用途都非常有用-除了回声: echo "Message" 产生输出 + echo "Message" Message 这有点多余,看起来有点奇怪。有没有办法保持-x启用状态,但仅输出 Message 而不是上面的两行,例如通过在echo命令前添加特殊命令字符,还是重定向输出?

3
ZSH:在bash函数“ read:1:-p:no coprocess”中,读取命令失败
编辑: 似乎在工作bash。看来问题与zsh。如果有更好的网站发布此问题,请告诉我。 我正在编写一个创建一系列目录的简单脚本。我希望用户先确认。我使用以下内容作为基础,但似乎无法使其在bash函数中运行。如果我将其放在函数之外,则可以正常工作。这是一个孤立的示例: read.sh #!/bin/bash test() { read -p "Here be dragons. Continue?" -n 1 -r if [[ $REPLY =~ ^[Yy]$ ]] then echo "You asked for it..." fi } 该 SO帖子中的代码。 搜索文件和/或test导致以下错误:read:1: -p: no coprocess。当我将其放在我的输出相同.bashrc 编辑: @hennes 我希望该函数位于配置文件中,因此我可以从任何目录(理想情况下是.bashrc或.zshrc)调用它 我已经纠正了第一条注释行的格式。问题仍然存在zsh Bash版本是3.2,但是您已经帮助我弄清楚问题出在zsh而不是bash。

3
如何在Mac OS X Yosemite上更新bash
只是想稍微学习一下bash脚本。我的旧bash版本: Bash version 3.2.53(1)-release... 我已经用自制软件在Mac OS X优胜美地上更新了bash: brew update brew install bash 然后在终端属性中,我将标准外壳程序路径从更改/bin/bash为/usr/local/bin/bash(据我所知,这是自制软件安装更新的bash的位置)。 然后我再次检查了结果(看起来一切都很好): $ echo $BASH_VERSION Bash version 4.0.33(0)-release... 但是,当我尝试编写一个简单的bash脚本时: #!/bin/bash echo "Bash version ${BASH_VERSION}..." for i in {0..10..2} do echo "Welcome $i times" done 结果是: Bash version 3.2.53(1)-release... Welcome {0..10..2} times 代替: Bash version 4.0.33(0)-release... Welcome 0 times …

2
如何在if / else语句中将变量与文本字符串而不是整数进行比较?
在编写shell脚本的过程中,我遇到了以下if / else语句出现在脚本中间的问题: if [ $act -eq "add" ] then read - "add or update: " $comm git commit -m "$comm $file" else git commit -m "$act $file" fi 返回错误为: ./gitup: line 13: [: add: integer expression expected 然后继续执行脚本的其余部分。我如何让if段将变量评估/比较为字符串输入而不是整数;在我尝试过的其他几件事中,使用“!=”时需要一个不同的错误。

1
Bash:可选地将参数传递给命令
我试图将参数添加到命令调用取决于另一个变量。请查看shell脚本代码: curl \ $([ -z "${title}" ] || echo --data-urlencode title=${title}) \ http://example.com 在示例中,如果title给定的值不为null,则会将参数添加到curl。 如果title包含空格,这将无法正常工作。同样,我也不$(...)能用引号引起来,因为如果title为null,它将产生意外的空参数curl。 我应该怎么做才能使其按预期工作。

3
使用管道将两个参数传递给命令
通常,我们只需要传递一个参数: echo abc | cat echo abc | cat some_file - echo abc | cat - some_file 有没有办法传递两个参数?就像是 {echo abc , echo xyz} | cat cat `echo abc` `echo xyz` 我可以先将结果存储在一个文件中 echo abc > file1 echo xyz > file2 cat file1 file2 但后来我可能不小心覆盖了一个文件,这是不行的。这将进入非交互式脚本。基本上,我需要一种方法将两个任意命令的结果传递给 cat 无需写入文件。 更新: 对不起,该示例掩盖了问题。而 { echo abc …


2
编写可在任何shell上运行的shell脚本(使用多个shebang行?)
我刚刚开始更深入地了解Shell脚本,而且我一直只是将我的脚本扔到一个文件中,对其进行标记chmod +x,然后完成/path/to/script.sh,然后让任何默认的解释器使用它,我认为这是zsh,因为那是我用我的壳。显然/bin/sh,即使我从zsh提示符执行脚本,这似乎也是默认设置,因为我开始在脚本中放入特定于zsh的内容,除非我运行,否则它会失败zsh /path/to/script.sh。 明确地说,这是我的问题: 当#!/path/to/shell开始没有shebang行()时,哪个shell执行脚本?我假设/bin/sh但无法确认。 在编写可在任何平台上运行的shell脚本方面,什么被称为“最佳实践”?(好的,这是开放式的) 如果zsh不可用,是否有可能编写尝试使用zsh并退回到bash的脚本?我已经尝试过放置两条shebang行,如下所示,但是bad interpreter: /bin/zsh: no such file or directory如果我在没有zsh的计算机上尝试,那只会出错。 #!/bin/zsh #!/bin/bash

2
运行时命令的每个输出的前缀
我正在尝试制作模块化脚本。我有几个从单个脚本中调用的脚本/命令。 我想给每个单独的命令的输出加上前缀。 考试: 我的文件是allcommands.sh / command1.sh / command2.sh command1.sh输出 file exists file moved command2.sh输出 file copied file emptied allcommands.sh运行脚本command1.sh和command2.sh 我想为这两个脚本的每个输出加上前缀: [command1] file exists [command1] file moved [command2] file copied [command2] file emptied


2
正确转义bash脚本中的正斜杠以用于sed
我正在尝试通过在干燥模式下运行rsync并总结rsync输出中列出的文件的大小来确定在同步两个文件夹时将新复制的文件的大小。 目前,我一直坚持以文件的父文件夹作为前缀。我发现了如何使用sed为行添加前缀以及如何使用sed进行转义,但是我很难将两者结合起来。 这是我走了多远: source="/my/source/folder/" target="/my/target/folder/" escaped=`echo "$source" | sed -e 's/[\/&]/\\//g'` du `rsync -ahnv $source $target | tail -n +2 | head -n -3 | sed "s/^/$escaped/"` | awk '{i+=$1} END {print i}' 这是我从bash -x myscript.sh获得的输出 + source=/my/source/folder/ + target=/my/target/folder ++ echo /my/source/folder/ ++ sed -e 's/[\/&]/\//g' + escaped=/my/source/folder/ + …

1
如何在bash脚本中切换/更改用户ID以在同一脚本中执行命令?
有没有一种方法可以在脚本内切换用户身份(在安装过程中作为根用户执行),以执行某些命令而无需调用外部脚本,然后返回root运行其他命令? 有点: #!/bin/bash some commands as root SWITCH_USER_TO user some commands as user including environment variables checks, without calling an external script SWITCH_USER_BACK some other stuff as root, maybe another user id change...

5
如何按行截断文件?
我有大量文件,其中一些文件很长。如果它们较大,我想通过删除文件末尾将它们截断为特定大小。但是我只想删除整行。我怎样才能做到这一点?感觉像是Linux工具链会处理的事情,但我不知道正确的命令。 例如,假设我有一个120,000字节的文件,其中有300字节的行,而我试图将其截断为10,000字节。前33行应保留(9900字节),其余部分应删减。我不想精确地削减10,000个字节,因为那样会留下一部分。 当然,文件的长度不同,行的长度也不尽相同。 理想情况下,生成的文件将稍短而不是稍长(如果断点很长),但这并不是太重要,如果更容易的话,可能会稍长一些。我希望直接对文件进行更改(好吧,可能是将新文件复制到其他位置,将原始文件删除,然后将新文件移动了,但这与用户的POV相同)。将数据重定向到很多地方然后返回的解决方案可能会损坏文件,我想避免这种情况...

2
bash完成文件名模式或目录
我正在尝试设置bash完成脚本并遇到一些麻烦。 我想进行设置,以使列出的补全是与特定扩展名匹配的文件或目录(可能包含该扩展名的文件,也可能不包含该扩展名的文件)。 我遇到的麻烦是,让我包含文件和目录的-o plusdirs -f -X '!*.txt'补全的唯一方法是使用诸如之类的东西,但是当我让bash完成其中一个目录时,它只是在末尾添加了一个空格,而不是削减。 _xyz() { local cur=${COMP_WORDS[COMP_CWORD]} local prev=${COMP_WORDS[COMP_CWORD-1]} #COMPREPLY=( $( compgen -f -X '!*.txt' -- $cur ) ) #COMPREPLY=( $( compgen -f -G '*.txt' -- $cur ) ) #COMPREPLY=( $( compgen -o filenames -f -X '!*.txt' -- $cur ) ) #COMPREPLY=( $( compgen -o dirnames …

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.