簡體   English   中英

在 Mac 上使用 Shell 腳本出現錯誤替換錯誤?

[英]Getting Bad substitution error with a Shell Script on a mac?

每當我在 Mac OSX 終端中運行 shell 腳本時,我都會收到一條錯誤消息“./query.sh: line 5: ${1,,}: bad replacement”

#!/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如果您想利用bash擴展,請使用#!/usr/local/bin/bash (或任何合適的,在安裝新版本的bash )便攜性的代價。

如果您無論如何都使用子shell 來生成值,您不妨將調用更改為可移植回早期版本的 Bash。

在子shell(括號中)中運行cut -b1是無用的,在轉換后執行它意味着您轉換了一個可能很長的字符串,然后丟棄除第一個字符之外的所有內容。

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

還要注意echo參數周圍的雙引號。

您真的希望將后綴new附加到值上嗎? 在這種情況下, if的第一個條件永遠不會匹配。

您可能還應該重構代碼以避免深的“箭頭反模式”,並且只有在您擁有要搜索的文件名的值后才執行grep

正如其他答案中提到的,Mac 上的內置 bash 非常舊,必須升級才能使用某些運算符,例如插入符運算符。 如果你使用自制軟件運行brew install bash ,並按照說明這個職位

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM