tcsh grep 麻烦

Гри*_*рий 3 freebsd tcsh

我使用 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 变量的命令外壳中获取它提供给我的字符串?

ste*_*ver 5

这不是问题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)