为什么在使用标准输入和输出的 csh 脚本中出现 "No Match" 错误?
Why am I getting a "No Match" error in csh script with standard input and output?
我正在尝试感受一下 Unix,以便我可以在 UNIX csh 中编写一个简短的程序,该程序采用标准输入和 returns 标准输出。所以我写了下面的代码:
echo "TEST"
echo -n "Input: "
set TEST = "$<"
echo $TEST
但是,当我输入某些字符时,我总是收到一个我不太明白的错误。例如,
运行 1:没有问号。如您所见,它完全按照我的意愿运行。
edoras ~/As4[199]% ./scriptp1
TEST
Input: www.google.com/search
www.google.com/search
运行 2:带问号。突然出现 "no match" 错误。
edoras ~/As4[201]% ./scriptp1
TEST
Input: https://www.google.com/search?criteria
echo: No match.
那么这个错误是什么,我该如何修复它?因为对于我必须编写的实际程序,我必须能够读取所有特殊字符并打印出它们的 ASCII 代码。
来自tcsh
manual page:
Unless enclosed in '"'
or given the ':q'
modifier the results of variable substitution may eventually be command and filename substituted.
由于未引用变量,shell 尝试文件名替换,但失败了,因为您可能在名为 www.google.com
的子目录中没有匹配 search?citeria
的文件当前目录中名为 https:
的子目录。 "No match" 表示文件名替换失败。来自同一手册页:
It is an error for a glob-pattern containing '*'
, '?'
, '['
or '~'
, with or without '^'
, not to match any files.
技术解答到此结束。其余的纯粹是基于意见。
请注意,除非您有特定的充分理由,否则通常认为在 POSIX 兼容 shell 中编写脚本更可取,仅仅是因为 csh
兼容 shells 在默认情况下并不总是可用。我认为作为初学者,您真的应该首先学习在 POSIX 兼容的 shell 中编写脚本,然后才在需要时考虑 csh
兼容的 shell。
亚历克斯的回答是正确的。这 ”?”是 UNIX 中为特殊命令保留的一系列元字符之一,因此为了打印它们,我们必须跳过一些我还没有完全弄清楚的环节。但至少现在我知道为什么我会得到那个输出。
“?”是一个匹配命令,所以,就像 Alex 所说的,它试图将我的输入与不存在的东西相匹配,而不是打印出没有特殊值的纯旧文本字符。
我正在尝试感受一下 Unix,以便我可以在 UNIX csh 中编写一个简短的程序,该程序采用标准输入和 returns 标准输出。所以我写了下面的代码:
echo "TEST"
echo -n "Input: "
set TEST = "$<"
echo $TEST
但是,当我输入某些字符时,我总是收到一个我不太明白的错误。例如,
运行 1:没有问号。如您所见,它完全按照我的意愿运行。
edoras ~/As4[199]% ./scriptp1
TEST
Input: www.google.com/search
www.google.com/search
运行 2:带问号。突然出现 "no match" 错误。
edoras ~/As4[201]% ./scriptp1
TEST
Input: https://www.google.com/search?criteria
echo: No match.
那么这个错误是什么,我该如何修复它?因为对于我必须编写的实际程序,我必须能够读取所有特殊字符并打印出它们的 ASCII 代码。
来自tcsh
manual page:
Unless enclosed in
'"'
or given the':q'
modifier the results of variable substitution may eventually be command and filename substituted.
由于未引用变量,shell 尝试文件名替换,但失败了,因为您可能在名为 www.google.com
的子目录中没有匹配 search?citeria
的文件当前目录中名为 https:
的子目录。 "No match" 表示文件名替换失败。来自同一手册页:
It is an error for a glob-pattern containing
'*'
,'?'
,'['
or'~'
, with or without'^'
, not to match any files.
技术解答到此结束。其余的纯粹是基于意见。
请注意,除非您有特定的充分理由,否则通常认为在 POSIX 兼容 shell 中编写脚本更可取,仅仅是因为 csh
兼容 shells 在默认情况下并不总是可用。我认为作为初学者,您真的应该首先学习在 POSIX 兼容的 shell 中编写脚本,然后才在需要时考虑 csh
兼容的 shell。
亚历克斯的回答是正确的。这 ”?”是 UNIX 中为特殊命令保留的一系列元字符之一,因此为了打印它们,我们必须跳过一些我还没有完全弄清楚的环节。但至少现在我知道为什么我会得到那个输出。
“?”是一个匹配命令,所以,就像 Alex 所说的,它试图将我的输入与不存在的东西相匹配,而不是打印出没有特殊值的纯旧文本字符。