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

Zub*_*ain 3 macos shell terminal posix sh

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

#!/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
Run Code Online (Sandbox Code Playgroud)

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

che*_*ner 5

,,操作员是在bash4.0 中引入的,但/bin/bash在macOS上仍是3.2版。您可以安装的较新版本bash并相应地更改shebang,也可以letter1=$(echo "$1" | tr '[:upper:]' '[:lower:]' | cut -b1)改用。

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

我的建议是/bin/bash在macOS上将其视为与POSIX兼容的外壳。#!/bin/sh如果您想要一个可移植的脚本,请使用;如果要使用扩展功能(以可移植性为代价),请使用#!/usr/local/bin/bash(或在安装的新版本之后进行适当的使用bashbash