在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脚本获取错误的替换错误?的主要内容,如果未能解决你的问题,请参考以下文章