BASH正在尝试创建拼字生成器,生成错误:第15行:?:语法错误:应为操作数(错误标记为“?”)
如果主脚本的命令行参数中有任何“?”字符,则将运行该脚本。我用I来遍历字母表,基本上将字母表中每个字母的“?”设置为$I。我认为发生错误是因为字符数组末尾出现了一个特殊字符,无法与“?”进行比较,但我不知道如何处理。我已经用过ShellCheck了 编辑:由主脚本生成的文本文件包括命令行参数中提供的字母的所有排列(无重复),每个排列之间都有硬返回,我非常确定硬返回字符是产生错误的原因。下面是permute.txt的一个示例BASH正在尝试创建拼字生成器,生成错误:第15行:?:语法错误:应为操作数(错误标记为“?”),bash,Bash,如果主脚本的命令行参数中有任何“?”字符,则将运行该脚本。我用I来遍历字母表,基本上将字母表中每个字母的“?”设置为$I。我认为发生错误是因为字符数组末尾出现了一个特殊字符,无法与“?”进行比较,但我不知道如何处理。我已经用过ShellCheck了 编辑:由主脚本生成的文本文件包括命令行参数中提供的字母的所有排列(无重复),每个排列之间都有硬返回,我非常确定硬返回字符是产生错误的原因。下面是permute.txt的一个示例 at? a?t ta? t?a ?at ?ta 下面是经过轻微编辑的脚
at?
a?t
ta?
t?a
?at
?ta
下面是经过轻微编辑的脚本:
#reads the text file produced by another script into the array
readarray words < ./permute.txt
#runs through loop 26 times with i as a letter in the alphabet
for i in {a..z}; do
#runs through every word in the array provided by the text file
for j in "${words[@]}"; do
s=$j #sets $j to a variable to mess with
declare -a a
word=""
#splits string s into character array
while read -n 1 c; do a+=($c); done <<< "$s"
#checks array for "?", used as a blank tile and changes that character to $i
for k in "${a[@]}"; do if [ "$k" = "?" ]; then a[$k]=$i; fi; done
#puts the array back together into a string
for ((k=0; k<${#a}; k++)); do echo $word; word=$word${a[$k]}; done
valid=$(grep -w $word /usr/share/dict/words) #checks for word in dictionary
#statement that fixes bug where words with apostrophes end up in the output
if [ ${#valid} -eq ${#i} ]; then
echo "$valid"
fi
done
done
#将另一个脚本生成的文本文件读取到数组中
readarray words<./permute.txt
#以字母表中的字母i在循环中运行26次
对于{a..z}中的i;做
#遍历文本文件提供的数组中的每个单词
用“${words[@]}”表示j;做
s=$j#将$j设置为要处理的变量
声明-a
word=“”
#将字符串拆分为字符数组
读时-n1c;做a+=($c);完成我明白了吗,你想换新的吗?在所有字符a..z的排列中,然后检查它们是否在字典中?
我会尝试不手动阵列工作,让sed为您工作(替换?)
您甚至可以使用bash的内置替换变量:
for i in {a..z}; do
for word in $(< permute.txt); do
grep -w ${word/\?/$i} /usr/share/dict/words
done
done
{a..z}中i的;做
美元中的单词(
顺便说一句:我不明白最后一个if语句。由于$i是一个字符,$valid是一整行,它至少包含一个(在本例中)3个字符的单词,如果[${valid}-eq${i}]永远不会为真。将脚本的第一行添加到问题中,顺便说一句,会发现一些明显的错误。修复您的引用,检查shebang和调用方法以确保shell实际上是bash(不能使用#!/bin/sh
或sh-yourscript
),或者从[
切换到[
,或者从=
切换到=
(POSIX标准化字符串比较运算符;bash添加了==
作为扩展,但将其与POSIX测试运算符[]
一起使用是一种糟糕的形式)…但无论如何,根据shellcheck的指示,添加所有缺少的引号将意味着具有特殊含义的字符或在IFS中找到的字符将不再扰乱代码。(同样,在readarray
之前声明-a
也没有意义;后者隐式地将类型设置为数组)如前所述,这两种情况在几种情况下都会表现不好。例如,看看如果您的输入中有*
作为一个单词,会发生什么情况——glob会被扩展,这意味着您最终会查找文件名。有关读取文件的最佳实践,请参阅。
for i in {a..z}; do
for word in $(< permute.txt); do
grep -w ${word/\?/$i} /usr/share/dict/words
done
done