$ * переменная функции zsh приводит к неожиданным результатам

Я думаю, ваш код должен быть таким

Если вы хотите получить вывод типа

Serial_Number Name_Of_Element Count имя файла 1 имя файла 2

#!/bin/bash
FILENAME=$1

count=0

while read LINE

do

let count++

VAL=$(grep -r $LINE /home/user/vaishnavi | awk -F ':' '{print $1}' | sort -u )
NUM=$(grep -r $LINE /home/user/vaishnavi | wc -l)

echo "$count $LINE $NUM"
echo "$VAL"

done < $FILENAME

echo -e "\nTotal $count Lines read"
1
23.05.2017, 15:40
1 ответ

Шаблон grep выглядит неправильно. Эмпирическое правило командной строки заключается в том, что все, что находится внутри одинарных кавычек, воспринимается буквально, тогда как, если оно не заключено в кавычки или внутри двойных кавычек, оболочка расширяет такую ​​строку в соответствии с ее правилами (подстановка, разделение, расширение параметров и т. Д.). В вашем случае команда

grep -E '*"$*"*' ~/.dotfiles/zsh/aliases.zsh

означает передачу grep string * "$ *" * буквально, так что grep интерпретирует этот шаблон как звездочку, за которой следует двойная кавычка, за которой следует Долярный знак повторяется ноль или более раз ( * ), за которым следует двойная кавычка, повторяющаяся ноль или более раз ( * ). Это не то, чего вы ожидаете.

Вы хотите рассматривать $ * как переменную (в данном случае в двойных кавычках), поэтому закройте строку в одинарных кавычках перед ней и откройте после нее:

grep -E '*'"$*"'*' ~/.dotfiles/zsh/aliases.zsh

Но я не вижу причины для этих звезд (вы же не хотите искать звезды, не так ли?), мне кажется, что вы можете просто упростить это до

grep -E "$*" ~/.dotfiles/zsh/aliases.zsh
3
27.01.2020, 23:25

Теги

Похожие вопросы