标签: bash-scripting

如何在 bash shell 中输入文字制表符?

例如,我想使用带有 -t 选项的 sort 实用程序来指定制表符分隔符,但是

sort -t "\t"
Run Code Online (Sandbox Code Playgroud)

不起作用。

bash bash-scripting

79
推荐指数
2
解决办法
10万
查看次数

ZSH:读取命令在 bash 函数“read:1: -p: no coprocess”中失败

编辑:

似乎在bash. 看来问题与zsh. 如果有更好的网站可以发布此问题,请告诉我。


我正在编写一个创建一系列目录的简单脚本。我希望用户在我这样做之前给予确认。我使用以下作为基础,但似乎无法让它在 bash 函数中运行。如果我把它放在函数之外,它工作正常。这是一个孤立的例子:

读.sh

#!/bin/bash
test() {
  read -p "Here be dragons. Continue?" -n 1 -r
  if [[ $REPLY =~ ^[Yy]$ ]]
  then
    echo "You asked for it..."
  fi
}
Run Code Online (Sandbox Code Playgroud)

来自this SO post的代码。

获取文件和/或test导致以下错误:read:1: -p: no coprocess. 当我把它放在我的.bashrc

编辑::

@hennes

  1. 我希望该函数位于配置文件中,因此我可以从任何目录(最好是我的 .bashrc 或 .zshrc)调用它
  2. 我已经更正了第一行注释行的格式。问题仍然存在于zsh
  3. Bash 版本是 3.2,但您帮助我弄清楚问题出在 zsh 而不是 bash。

zsh bash-scripting

47
推荐指数
3
解决办法
2万
查看次数

抑制 echo 命令的执行跟踪?

我正在运行 Jenkins 的 shell 脚本,它使用 shebang options 启动 shell 脚本#!/bin/sh -ex

根据Bash Shebang 的假人?, -x, “导致 shell 打印执行跟踪”,这对于大多数用途都非常有用——除了回声:

echo "Message"
Run Code Online (Sandbox Code Playgroud)

产生输出

+ echo "Message"
Message
Run Code Online (Sandbox Code Playgroud)

这有点多余,看起来有点奇怪。有没有办法保持-x启用,但只输出

Message
Run Code Online (Sandbox Code Playgroud)

而不是上面的两行,例如通过在 echo 命令前加上一个特殊的命令字符,或者重定向输出?

bash shell command-line bash-scripting jenkins

36
推荐指数
3
解决办法
5万
查看次数

如何在 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
Run Code Online (Sandbox Code Playgroud)

返回的错误是:

./gitup: line 13: [: add: integer expression expected
Run Code Online (Sandbox Code Playgroud)

然后继续执行脚本的其余部分。如何让 if 段评估/比较变量与字符串输入而不是整数;在我尝试的其他一些事情中使用“!=”时需要一个不同的错误。

bash shell-script bash-scripting

35
推荐指数
2
解决办法
11万
查看次数

Bash:可选地将参数传递给命令

我正在尝试向依赖于另一个变量的命令调用添加参数。请看shell脚本代码:

curl \
  $([ -z "${title}" ] || echo --data-urlencode title=${title}) \
  http://example.com
Run Code Online (Sandbox Code Playgroud)

在这个例子中,如果title给定的不是 null,一个参数将被添加到curl.

如果title包含空格,这将无法正常工作。我也不$(...)能用引号括起来,因为如果title为空,它会产生一个意想不到的空参数curl

我应该怎么做才能让它按预期工作。

bash shell-script command-line-arguments bash-scripting

30
推荐指数
1
解决办法
8203
查看次数

Bash 脚本中的 <<!END 是什么?

考虑:

#!/bin/bash

/u01/app/oracle/middleware/oracle_common/common/bin/wlst.sh <<!END
connect('user','pw');
p=redeploy('application');
p.printStatus();
exit();
!END
Run Code Online (Sandbox Code Playgroud)

上面的脚本可以帮助我重新部署 weblogic 应用程序。我不明白的区域wlst.sh <<!END和最后一个!END.

这两个!END语句的作用是什么?

bash bash-scripting

29
推荐指数
1
解决办法
3638
查看次数

使用管道将两个参数传递给命令

通常,我们只需要传递一个参数:

echo abc | cat
echo abc | cat some_file -
echo abc | cat - some_file
Run Code Online (Sandbox Code Playgroud)

有没有办法传递两个参数?就像是

{echo abc , echo xyz} | cat
cat `echo abc` `echo xyz`
Run Code Online (Sandbox Code Playgroud)

我可以先将两个结果存储在一个文件中

echo abc > file1
echo xyz > file2
cat file1 file2
Run Code Online (Sandbox Code Playgroud)

但是我可能会不小心覆盖一个文件,这是不行的。这是进入一个非交互式脚本。基本上,我需要一种方法来将两个任意命令的结果传递给cat而不写入文件。


更新:抱歉,该示例掩盖了问题。虽然{ echo abc ; echo xyz ; } | cat似乎确实有效,但输出是由于echos 而不是cat.

一个更好的例子是{ cut -f2 -d, file1; cut -f1 -d, file2; } | paste -d,它不能按预期工作。

file1:
a,b …
Run Code Online (Sandbox Code Playgroud)

bash shell-script pipe command-line-arguments bash-scripting

27
推荐指数
1
解决办法
5万
查看次数

如何在 Mac OS X Yosemite 上更新 bash

只是想学习一下 bash 脚本。我的旧 bash 版本:

Bash version 3.2.53(1)-release...
Run Code Online (Sandbox Code Playgroud)

我已经用自制软件在 mac os x yosemite 上更新了我的 bash:

brew update
brew install bash
Run Code Online (Sandbox Code Playgroud)

然后在终端属性中,我将标准 shell 路径从 更改/bin/bash/usr/local/bin/bash(据我所知,这是自制软件安装更新后的 bash 的地方)。

然后我再次检查了结果(似乎一切都很好):

$ echo $BASH_VERSION
Bash version 4.0.33(0)-release...
Run Code Online (Sandbox Code Playgroud)

但是当我尝试编写一个简单的 bash 脚本时:

#!/bin/bash
echo "Bash version ${BASH_VERSION}..."
for i in {0..10..2}
  do
     echo "Welcome $i times"
 done
Run Code Online (Sandbox Code Playgroud)

结果是:

Bash version 3.2.53(1)-release...
Welcome {0..10..2} times
Run Code Online (Sandbox Code Playgroud)

代替:

Bash version 4.0.33(0)-release...
Welcome 0 times
Welcome 2 times
Welcome 4 times
Welcome 6 times
Welcome 8 …
Run Code Online (Sandbox Code Playgroud)

bash shell shell-script bash-scripting macos

26
推荐指数
3
解决办法
2万
查看次数

命中后如何grep并打印下N行?

我想对文本文件中的一个事件进行 grep,然后在找到每个事件后打印以下 N 行。有任何想法吗?

grep bash-scripting

25
推荐指数
4
解决办法
6万
查看次数

编写可在任何 shell 上运行的 shell 脚本(使用多个 shebang 行?)

我刚刚开始更深入地研究 shell 脚本,我总是把我的脚本放在一个文件中,标记它chmod +x然后完成/path/to/script.sh并让任何默认的解释器使用它,我认为它是 zsh,因为这就是我用于我的外壳。显然,它似乎只是/bin/sh默认情况下,即使我从 zsh 提示符执行脚本,因为我开始将特定于 zsh 的东西放入我的脚本中,除非我运行zsh /path/to/script.sh.

为了切入正题,以下是我的问题:

  1. #!/path/to/shell开头没有 shebang 行 ( )时,哪个 shell 执行脚本?我假设/bin/sh但我无法确认。
  2. 在编写可在任何平台上运行的 shell 脚本方面,什么被认为是“最佳实践”?(好吧,这是一种开放式)
  3. 如果 zsh 不可用,是否可以编写一个尝试使用 zsh 并回退到 bash 的脚本?我试过放置两条shebang行,如下所示,但是bad interpreter: /bin/zsh: no such file or directory如果我在没有zsh的机器上尝试它只会出错。

    #!/bin/zsh

    #!/bin/bash

bash zsh shell shell-script bash-scripting

21
推荐指数
1
解决办法
7820
查看次数