在Mac上使用Shell脚本获取错误的替换错误?

时间:2017-12-14 14:23:45

标签: macos shell terminal sh posix

我收到一条错误消息“./query.sh:line 5:$ {1 ,,}:错误替换”每当我在Mac OSX终端中运行shell脚本时

<p>Text</p>

脚本功能是搜索大量数据文件,所以有人可以帮我查明问题的根源吗?

3 个答案:

答案 0 :(得分:5)

,, 4.0中引入了bash运算符,但macOS上的/bin/bash仍然是版本3.2。您可以安装较新版本的bash并相应更改您的shebang,或者您可以改为使用letter1=$(echo "$1" | tr '[:upper:]' '[:lower:]' | cut -b1)

(但是,您可以使用${letter:0:1}${letter:1:1}等来代替对cut的调用,以便从字符串中获取单个字母。)

我的建议是将macOS上的/bin/bash视为与POSIX兼容的shell。如果您想要可移植脚本,请使用#!/bin/sh,或者如果您想利用#!/usr/local/bin/bash,请使用bash(或在安装新版bash后适当的任何内容)以可移植性为代价的扩展。

答案 1 :(得分:1)

如果您正在使用子shell来生成值,那么您也可以将调用更改为可移植回早期版本的Bash。

在子shell中(在括号中)运行cut -b1是无用的,在转换后执行此操作意味着您转换了一个可能很长的字符串,然后丢弃除第一个字符之外的所有内容。

letter1=$(echo "${1:0:1}" | tr '[:upper:]' '[:lower:]')new

另请注意echo参数附近的双引号。

您真的希望将后缀new附加到值吗?在这种情况下,if中的第一个条件永远不会匹配。

您可能还应该重构代码以避免深层"arrow antipattern",并且只有在您要搜索的文件名值时才执行grep

答案 2 :(得分:0)

如其他答案所述,Mac 上的内置 bash 非常旧,必须升级才能使用某些运算符,例如插入符运算符。如果您使用自制软件,请运行 brew install bash 并按照 this post 中的说明进行操作。