如何转义从命令行传递到 bash 脚本中的命令的引号

如何转义从命令行传递到 bash 脚本中的命令的引号

我使用的是 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

相关内容