每当我在Mac OSX终端中运行shell脚本时,都会收到错误信息"./query.sh: line 5:${1,,}:bad substitution“
#!/bin/bash
dir=$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )
if [ "$1" != "" ]; then
letter1=$(echo ${1,,}|(cut -b1))new
if [[ $letter1 == [a-zA-Z0-9] ]]; then
if [ -f "$dir/data/$letter1" ]; then
grep -ai "^$1" "$dir/data/$letter1"
else
letter2=$(echo ${1,,}|cut -b2)
if [[ $letter2 == [a-zA-Z0-9] ]]; then
if [ -f "$dir/data/$letter1/$letter2" ]; then
grep -ai "^$1" "$dir/data/$letter1/$letter2"
else
letter3=$(echo ${1,,}|cut -b3)
if [[ $letter3 == [a-zA-Z0-9] ]]; then
if [ -f "$dir/data/$letter1/$letter2/$letter3" ]; then
grep -ai "^$1" "$dir/data/$letter1/$letter2/$letter3"
fi
else
if [ -f "$dir/data/$letter1/$letter2/symbols" ]; then
grep -ai "^$1" "$dir/data/$letter1/$letter2/symbols"
fi
fi
fi
else
if [ -f "$dir/data/$letter1/symbols" ]; then
grep -ai "^$1" "$dir/data/$letter1/symbols"
fi
fi
fi
else
if [ -f "$dir/data/symbols" ]; then
grep -ai "^$1" "$dir/data/symbols"
fi
fi
else
echo "[*] Example: ./query name@domain.com"
fi脚本的功能是搜索大量的数据文件,所以有人能帮我找出问题的根源吗?
发布于 2017-12-14 22:36:29
,,运算符是在bash 4.0中引入的,但macOS上的/bin/bash仍然是3.2版。您可以安装更新版本的bash并相应地更改您的系统,或者您也可以改用letter1=$(echo "$1" | tr '[:upper:]' '[:lower:]' | cut -b1)。
(但是,您可以使用${letter:0:1}、${letter:1:1}等代替对cut的调用来从字符串中获取单个字母。)
我的建议是将macOS上的/bin/bash视为与POSIX兼容的shell。如果您想要一个可移植的脚本,请使用#!/bin/sh;如果您想以牺牲可移植性为代价来利用bash扩展,请使用#!/usr/local/bin/bash (或者在安装新版本的bash之后使用任何合适的工具)。
发布于 2017-12-14 22:49:25
如果您无论如何都使用子subshell来生成值,那么您也可以将调用更改为可移植回早期版本的Bash。
在子subshell中运行cut -b1 (在圆括号中)是没有用的,在转换之后运行意味着您将转换一个可能很长的字符串,然后丢弃除第一个字符之外的所有内容。
letter1=$(echo "${1:0:1}" | tr '[:upper:]' '[:lower:]')new还要注意echo参数两边的双引号。
是否确实希望将后缀new附加到值?在这种情况下,if中的第一个条件永远不会匹配。
您可能还应该重构代码以避免深度"arrow antipattern",并且仅在获得要搜索的文件名的值后才执行grep。
发布于 2021-03-02 23:12:36
正如在其他答案中提到的,Mac上的内置bash非常旧,必须升级以使用某些操作符,例如插入符号操作符。如果您使用自制软件,请运行brew install bash并按照this post中的说明进行操作。
https://stackoverflow.com/questions/47815637
复制相似问题