[英]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.