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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在Mac上使用Shell脚本获取错误的替换错误?相关的知识,希望对你有一定的参考价值。

每当我在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

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

答案

,,运算符是在bash 4.0中引入的,但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之后)。

另一答案

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

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

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

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

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

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

以上是关于在Mac上使用Shell脚本获取错误的替换错误?的主要内容,如果未能解决你的问题,请参考以下文章

在shell脚本中获取未绑定的变量错误

APNS,当程序在 Mac 上运行时,如何修复树莓派上的“无法获取本地颁发者证书”错误?

shell脚本批量获取内网主机的MAC地址

shell脚本中的2补码

shell脚本错误问题

linux shell 获取上一条命令 不是结果