我使用的是 Debian 10。我经常运行一个命令来搜索文本。
sudo grep -rin <path> -e <text to search for>
由于我经常使用这个命令,我想创建一个简单的脚本来自动化它的一部分并像这样调用它:
stx -p <path> -t <text to search for>
所以我可以这样称呼它:
stx -p /var/www -t 'navbar ul'
stx -p ~/.wine/drive_c/Program\ Files -t 'asdf ghjk'
路径和搜索文本可能包含空格,这给我带来了如何处理引号和转义的问题。剧本:
#!/usr/bin/bash
#search text
while [ -n "$1" ]; do
case "$1" in
-p) path="$2" # path to start search in
shift
;;
-t) txt="$2" # text to search for
shift
;;
esac
shift
done
echo sudo grep -rin $path -e \'$txt\'
#exit 0
sudo grep -rin $path -e '$txt'
# grep options:
# r recursive
# i case-insensitive
# n show line number
在回显中,命令看起来是正确的。但是当我运行此命令时,我遇到了路径和文本部分的不同问题。路径部分似乎不适用于带有空格的文件名,并且文本部分似乎单独搜索每个单词。
答案1
问题不在于双引号变量。
学习如何在shell中正确引用,这非常重要:
“双引号”包含空格/元字符的每个文字以及每一个扩张:
"$var"
,"$(command "$var")"
,"${array[@]}"
,"a & b"
。用于'single quotes'
代码或文字$'s: 'Costs $5 US'
,ssh host 'echo "$HOSTNAME"'
.
看
http://mywiki.wooledge.org/Quotes
http://mywiki.wooledge.org/Arguments
http://wiki.bash-hackers.org/syntax/words