首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在mac上使用Shell脚本获得错误的替换错误?

在mac上使用Shell脚本获得错误的替换错误?
EN

Stack Overflow用户
提问于 2017-12-14 22:23:45
回答 3查看 5.9K关注 0票数 5

每当我在Mac OSX终端中运行shell脚本时,都会收到错误信息"./query.sh: line 5:${1,,}:bad substitution“

代码语言:javascript
复制
#!/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

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

EN

回答 3

Stack Overflow用户

发布于 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之后使用任何合适的工具)。

票数 6
EN

Stack Overflow用户

发布于 2017-12-14 22:49:25

如果您无论如何都使用子subshell来生成值,那么您也可以将调用更改为可移植回早期版本的Bash。

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

代码语言:javascript
复制
letter1=$(echo "${1:0:1}" | tr '[:upper:]' '[:lower:]')new

还要注意echo参数两边的双引号。

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

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

票数 1
EN

Stack Overflow用户

发布于 2021-03-02 23:12:36

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47815637

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档