我使用 FreeBSD
> uname -sr
FreeBSD 6.3-RELEASE
Run Code Online (Sandbox Code Playgroud)
当我查询
> grep `whoami` /etc/passwd
Run Code Online (Sandbox Code Playgroud)
它显示了我想要的信息:
但是当我尝试在 tcsh 脚本中获取它时:
#!/bin/tcsh
set login = `whoami`
echo $login
set query = `grep $login /etc/passwd`
echo $query
Run Code Online (Sandbox Code Playgroud)
它给我带来了以下内容:
dolg_gr
echo: No match.
Run Code Online (Sandbox Code Playgroud)
为什么“不匹配”?如何在 $query 变量的命令外壳中获取它提供给我的字符串?
这不是问题grep
-这是不带引号的变量扩展的问题
echo $query
Run Code Online (Sandbox Code Playgroud)
以及由 返回的匹配行grep
包含通配符的事实*
。在 中tcsh
,不成功的 glob 的默认行为类似于 bash 的failglob
选项 - 错误告诉您没有与您的 passwd 字符串匹配的文件名:
$ tcsh -c 'echo dol_gr:*:3291'
echo: No match.
Run Code Online (Sandbox Code Playgroud)
正如 Stéphane Chazelas 所提到的,在 (t)csh 中引用变量扩展的正确方法是使用q
修饰符。另请注意,当未引用时,tcsh
'`...`
在 SPC、TAB 和 NL 上拆分,仅在引用时才在 NL 上拆分:
set query = "`grep $login:q /etc/passwd`"
echo $query:q
Run Code Online (Sandbox Code Playgroud)