我想使用子外壳来确保环境更改不会影响循环中的不同迭代,但我不确定我可以在子外壳内使用循环控制语句 ( break, continue):
#!/bin/sh
export A=0
for i in 1 2 3; do
(
export A=$i
if [ $i -eq 2 ]; then continue ; fi
echo $i
)
done
echo $A
Run Code Online (Sandbox Code Playgroud)
A循环外的值不受内部发生的任何影响,这没关系。但是允许使用continue子外壳内部还是应该将其移到外部?作为记录,它可以按原样工作,但也许这是一个不可靠的副作用。
我正在尝试编写一个 shell 脚本,在其中我必须查找字符串中是否存在-32 。不幸的是,我必须在不使用任何 bashism 的情况下执行此操作,因为它必须在运行 Dash 的计算机上运行。
我尝试过case ${1+"$@"} in *-32*);;,但这会得到类似-321的东西。有没有办法使用正则表达式或其他东西来查找该标志?它周围可以有其他标志,并在字符串中用空格分隔。
我认为我需要的正则表达式会查找 -32 ,后面带有空格或行尾。-32(\s|$)
我对正则表达式很陌生,所以我不确定这是否是最好的方法。任何帮助,将不胜感激!
谢谢!
我有一个破折号外壳安装为/bin/dash. 我查了dash的手册,和POSIX shell的手册是一样的,没有说shell的版本。
破折号 --version
不起作用。
如何告诉我有破折号的版本号?
补充:有些人指着我使用 Ubuntu 命令,好吧,不,我不是在运行 Ubuntu,我在运行 Centos。
从 Ubuntu 14.04 迁移到 16.04 时,我注意到我的几个 Bash 脚本由于缺少导出的函数而失败。我想知道这是否与Shellshock 错误的修复有关,即使我只是简单export -f的函数,而不是依赖 Bash 内部函数表示。失败不会发生在直接的 Bash 子 shell 中,只有在两者之间有另一个进程时才会发生。例如,Bash 调用 awk / Perl / Vim 调用另一个 Bash。下面是一个 Perl 的例子:
$ foo() { echo "foobar"; }
$ export -f foo
$ export -f; foo
foo ()
{
echo "foobar"
}
declare -fx foo
foobar
$ bash -c "export -f; foo"
foo ()
{
echo "foobar"
}
declare -fx foo
foobar
$ perl -e 'system("bash -c \"export -f; foo\"")'
foo …Run Code Online (Sandbox Code Playgroud) 在dashshell环境中,我希望将字符串拆分为数组.以下代码适用bash但不适用dash.
IFS=""
var="this is a test|second test|the quick brown fox jumped over the lazy dog"
IFS="|"
test=( $var )
echo ${test[0]}
echo ${test[1]}
echo ${test[2]}
Run Code Online (Sandbox Code Playgroud)
我的问题
是否dash支持此样式的数组.如果没有,是否有任何建议将此解析为另一种类型的变量而不使用循环?
我正在编写bash脚本,在Ubuntu中使用“ sh”命令时会引发错误(似乎与破折号不兼容,我正在学习此主题)。因此,我想检测是否使用破折号而不是bash引发错误。
如何在脚本上下文中检测到它?可能吗?
我试图让一个源 shell 脚本确定它自己的位置,我发现这对于 dash 来说是一项艰巨的任务。
在 bash、sh 和 csh 中,我可以使用:$_。
在鱼中,我可以使用(status -f).
总的来说,我没有运气......
我尝试获取如下所示的 path.sh 文件,结果如下:
# path.sh
called=$_
echo called: $called
echo underscore: $_
echo zero: $0
echo dash_source: $DASH_SOURCE
echo bash_source: $BASH_SOURCE
Run Code Online (Sandbox Code Playgroud)
dash -c ". path.sh"
输出:
called: /usr/local/bin/dash
underscore: /usr/local/bin/dash
zero: dash
dash_source:
bash_source:
Run Code Online (Sandbox Code Playgroud)
如何在破折号中获取path.sh的路径?
dash -c行为与以下不同bash -c:
docker run -it ubuntu /bin/dash -c ps
PID TTY TIME CMD
1 ? 00:00:00 sh
7 ? 00:00:00 ps
docker run -it ubuntu /bin/bash -c ps
PID TTY TIME CMD
1 ? 00:00:00 ps
Run Code Online (Sandbox Code Playgroud)
这种差异有解释吗?
符合POSIX的shell应提供这样的机制来迭代字符串集合:
for x in $(seq 1 5); do
echo $x
done
Run Code Online (Sandbox Code Playgroud)
但是,如何迭代单词的每个字符?
这是尝试找出read实用程序如何在多个shell中工作.发现差异对我来说似乎是个错误.
结果是破折号保留尾随空格,显示为:
dash: <a b >
bash: <a b>
Run Code Online (Sandbox Code Playgroud)
简而言之:为什么这个代码在bash和dash读取中表现不同?
dash -c 'echo " a b " | { read var; echo "<$var>"; }'
bash -c 'echo " a b " | { read var; echo "<$var>"; }'
Run Code Online (Sandbox Code Playgroud)