编辑:
似乎在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
zsh我正在运行 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 命令前加上一个特殊的命令字符,或者重定向输出?
在编写 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 段评估/比较变量与字符串输入而不是整数;在我尝试的其他一些事情中使用“!=”时需要一个不同的错误。
我正在尝试向依赖于另一个变量的命令调用添加参数。请看shell脚本代码:
curl \
$([ -z "${title}" ] || echo --data-urlencode title=${title}) \
http://example.com
Run Code Online (Sandbox Code Playgroud)
在这个例子中,如果title给定的不是 null,一个参数将被添加到curl.
如果title包含空格,这将无法正常工作。我也不$(...)能用引号括起来,因为如果title为空,它会产生一个意想不到的空参数curl。
我应该怎么做才能让它按预期工作。
考虑:
#!/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语句的作用是什么?
通常,我们只需要传递一个参数:
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
只是想学习一下 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) 我想对文本文件中的一个事件进行 grep,然后在找到每个事件后打印以下 N 行。有任何想法吗?
我刚刚开始更深入地研究 shell 脚本,我总是把我的脚本放在一个文件中,标记它chmod +x然后完成/path/to/script.sh并让任何默认的解释器使用它,我认为它是 zsh,因为这就是我用于我的外壳。显然,它似乎只是/bin/sh默认情况下,即使我从 zsh 提示符执行脚本,因为我开始将特定于 zsh 的东西放入我的脚本中,除非我运行zsh /path/to/script.sh.
为了切入正题,以下是我的问题:
#!/path/to/shell开头没有 shebang 行 ( )时,哪个 shell 执行脚本?我假设/bin/sh但我无法确认。如果 zsh 不可用,是否可以编写一个尝试使用 zsh 并回退到 bash 的脚本?我试过放置两条shebang行,如下所示,但是bad interpreter: /bin/zsh: no such file or directory如果我在没有zsh的机器上尝试它只会出错。
#!/bin/zsh
#!/bin/bash
bash-scripting ×10
bash ×8
shell-script ×5
shell ×3
zsh ×2
command-line ×1
grep ×1
jenkins ×1
macos ×1
pipe ×1