我正在尝试在 Bourne shell ( /bin/sh) 中使用数组。我发现初始化数组元素的方法是:
arr=(1 2 3)
Run Code Online (Sandbox Code Playgroud)
但它遇到了一个错误:
syntax error at line 8: `arr=' unexpected
Run Code Online (Sandbox Code Playgroud)
现在,我发现此语法的帖子说它是 for bash,但我找不到 Bourne shell 的任何单独语法。语法是否/bin/sh也一样?
我正在编写一个安装脚本,它将作为/bin/sh.
有一行提示输入文件:
read -p "goat may try to change directory if cd fails to do so. Would you like to add this feature? [Y|n] " REPLY
Run Code Online (Sandbox Code Playgroud)
我想把这条长行分成多行,这样每行都不超过 80 个字符。我说的是脚本源代码中的行;与执行脚本时实际打印在屏幕上的行无关!
我试过的:
第一种方法:
read -p "oat may try to change directory if cd fails to do so. " \
"Would you like to add this feature? [Y|n] " REPLY
Run Code Online (Sandbox Code Playgroud)
这不起作用,因为它不打印Would you like to add this feature? [Y|n]。
第二种方法:
echo "oat may try to change …Run Code Online (Sandbox Code Playgroud)我今天写了一个小脚本,其中包含
grep -q ^local0 /etc/syslog.conf
Run Code Online (Sandbox Code Playgroud)
在审查期间,一位同事建议^local0引用,因为^在 Bourne shell 中表示“管道”。对这个说法感到惊讶,我试图追踪任何提到这一点的参考资料。我在互联网上发现的任何内容都没有表明这是一个问题。
但是,事实证明,bshAIX 7 上的(声称是 Bourne shell)的实现实际上具有以下行为:
> bsh
$ ls ^ wc
23 23 183
$ ls | wc
23 23 183
Run Code Online (Sandbox Code Playgroud)
我尝试过的其他“Bourne shell”实现^都没有这种行为(也就是说,根本不被认为是 shell 元字符)。我sh在 CentOS(真正的 bash)和shFreeBSD(不是 bash)上尝试过。我没有很多其他系统可以尝试。
这种行为是预期的吗?哪些 shell 被认为^是管道元字符?
我知道如何for在bash.
如何在 POSIX shell 脚本中执行等效循环?
由于有多种方法可以实现同一目标,请随意添加您自己的答案并详细说明其工作原理。
一个这样的bash循环的例子如下:
#!/bin/bash
for (( i=1; i != 10; i++ ))
do
echo "$i"
done
Run Code Online (Sandbox Code Playgroud) 我正在寻找一个像这样工作的“in”运算符:
if [ "$1" in ("cat","dog","mouse") ]; then
echo "dollar 1 is either a cat or a dog or a mouse"
fi
Run Code Online (Sandbox Code Playgroud)
与使用多个“或”测试相比,这显然是一个更短的语句。
我在这里读了一个很棒的问题,叫做“理解 IFS”。我很惊讶,因为答案和评论引用了 POSIX,它指出 IFS= 与取消 IFS 不同。如果您取消设置 IFS,显然会使用默认值。如果您将 IFS 设为 null,则没有拆分器。我知道我看到了不同的看法,我在我的书签中找到了这个:
$IFS
脚本中的第一条语句应该是
IFS=
它将输入字段分隔符重置为其默认值。否则,您将从用户那里继承 $IFS,用户可能将它设置为一些奇怪的值,以使 sh 解析字符串的方式与您期望的方式不同,并导致奇怪的行为。
那么前一段时间是真的还是作者错了?
我正在查看具有以下内容的脚本:
if [ "${PS1-}" ]; then
Run Code Online (Sandbox Code Playgroud)
尾随的-错误让我有点,因为它似乎不是 Posix 或 Bash 标准语法。这是一些永远存在的神秘语法,还是打字错误?任何对标准/文档的引用将不胜感激。
通常我会编码它:
if [ "$PS1" ]; then
Run Code Online (Sandbox Code Playgroud)
哪个更正确或者它们之间有什么区别?
尝试在这里编写一个 shell 脚本,它不断测试我的服务器并在它出现故障时给我发送电子邮件。
问题是,当我从 ssh 连接注销时,尽管&在命令末尾运行它,例如./stest01.sh &,它会自动落入 else 并不间断地向我发送邮件,直到我再次登录并杀死它。
#!/bin/bash
while true; do
date > sdown.txt ;
cp /dev/null pingop.txt ;
ping -i 1 -c 1 -W 1 myserver.net > pingop.txt &
sleep 1 ;
if
grep "64 bytes" pingop.txt ;
then
:
else
mutt -s "Server Down!" myemail@address.com < sdown.txt ;
sleep 10 ;
fi
done
Run Code Online (Sandbox Code Playgroud) 我使用的是封闭网络(即没有连接到互联网)。
我有一个 bourne shell 脚本,要求用户输入与grep -P.
一般来说,我喜欢进行某种形式的输入验证。
有没有办法测试字符串变量以查看它是否是(有效的)正则表达式?
(可以将互联网上的内容复制到我的系统上,但这需要很长时间,而且是 PITA——因此我正在寻找在本地完成此操作的方法。)
#!/bin/sh
CONFIG_DIR="/var/opt/SUNWldm/"
read option
if [ $option -eq 9 ]; then
ret=1
elif [ -e ${CONFIG_DIR}file.xml.${option} ]; then
echo "TRUE"
fi
Run Code Online (Sandbox Code Playgroud)
我在 while 循环中有上面的代码来显示选项列表。不幸的是,我在elfi声明中遇到了问题。
From: IF for Beginners如果文件存在, -e 返回真。
我已经仔细检查了语法,甚至在调试模式下运行脚本(我放在set -x这个脚本的开头,可以看到中的替换if正确完成,如内联所示:
+ [ 201301271355 -eq 9 ]
+ [ -e /var/opt/SUNWldm/file.xml.201301271355 ]
./ldm_recover.sh: test: argument expected
Run Code Online (Sandbox Code Playgroud)
到目前为止,我一直在寻找并没有找到失败的原因,任何想法我做错了什么?