Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/apache/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
BASH正在尝试创建拼字生成器,生成错误:第15行:?:语法错误:应为操作数(错误标记为“?”)_Bash - Fatal编程技术网

BASH正在尝试创建拼字生成器,生成错误:第15行:?:语法错误:应为操作数(错误标记为“?”)

BASH正在尝试创建拼字生成器,生成错误:第15行:?:语法错误:应为操作数(错误标记为“?”),bash,Bash,如果主脚本的命令行参数中有任何“?”字符,则将运行该脚本。我用I来遍历字母表,基本上将字母表中每个字母的“?”设置为$I。我认为发生错误是因为字符数组末尾出现了一个特殊字符,无法与“?”进行比较,但我不知道如何处理。我已经用过ShellCheck了 编辑:由主脚本生成的文本文件包括命令行参数中提供的字母的所有排列(无重复),每个排列之间都有硬返回,我非常确定硬返回字符是产生错误的原因。下面是permute.txt的一个示例 at? a?t ta? t?a ?at ?ta 下面是经过轻微编辑的脚

如果主脚本的命令行参数中有任何“?”字符,则将运行该脚本。我用I来遍历字母表,基本上将字母表中每个字母的“?”设置为$I。我认为发生错误是因为字符数组末尾出现了一个特殊字符,无法与“?”进行比较,但我不知道如何处理。我已经用过ShellCheck了

编辑:由主脚本生成的文本文件包括命令行参数中提供的字母的所有排列(无重复),每个排列之间都有硬返回,我非常确定硬返回字符是产生错误的原因。下面是permute.txt的一个示例

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