我收到一条错误消息“./query.sh:line 5:$ {1 ,,}:错误替换”每当我在Mac OSX终端中运行shell脚本时
<p>Text</p>
脚本功能是搜索大量数据文件,所以有人可以帮我查明问题的根源吗?
答案 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 中的说明进行操作。