【问题标题】:"Debugging" bash shell script: escaping characters, passing arguments“调试” bash shell 脚本:转义字符、传递参数
【发布时间】:2012-10-04 08:46:47
【问题描述】:

我正在尝试编写一个 bash shell 脚本(我没有太多经验),以便在我通过 ssh 操作的 Unix 机器上搜索 C 代码。

这是我脚本中的代码:

#! /bin/bash

find . \( -name '*.c' -o -name '*.h' \) -exec grep -n '<SEARCH_STRING>' {} + | sed -e "s/^\(\..*\.c\):\([0-9]*\):[ \t]*\(.*\)$/\1 :: \2\n\3\n/" | sed -e "s/^\(\..*\.h\):\([0-9]*\):[ \t]*\(.*\)$/\1 :: \2\n\3\n/" | sed ''/<SEARCH_STRING>/s//`printf "\033[31m<SEARCH_STRING>\033[0m"`/'' | less -R

请注意,这只是我用来表示我的搜索字符串的内容,当然我实际上并不是按字面意思搜索。

我意识到这有几个问题。首先,当我在命令行中键入底线(没有 #!/bin/bash 标头的“脚本”)时,它实际上工作得很好,并给了我想要的结果。我知道在将其转换为 bash 脚本时应该转义某些字符,但我尝试转义几个(组合)字符,但它总是给我同样的错误:

find: missing argument to `-exec'
./code_search.sh: line 4: <SEARCH_STRING>: command not found
sed: -e expression #1, char 43: unterminated `s' command
printf: usage: printf [-v var] format [arguments]
./code_search.sh: line 8: \033[31m<SEARCH_STRING>\033[0m: command not found
sed: -e expression #1, char 46: unterminated `s' command

另外,我意识到我不应该将搜索字符串硬编码到我的脚本中,因为将搜索字符串作为参数提供给脚本要方便得多,但我真的不知道该怎么做那个。

正如我所说,我没有太多编写 bash 脚本的经验,我尝试编写这个脚本来帮助我完成编码工作。但是,我不能再花时间调试这个了,因为这不是我的老板付钱给我做的。我问过我的同事,但他们也没有一个能帮助我。

我知道自己不花很多精力去学习更多关于 bash shell 脚本的知识有点便宜,但是就像我说的那样,我真的不能抽出时间。谁能帮我完成这个脚本?

提前非常感谢!

【问题讨论】:

    标签: bash debugging shell command-line


    【解决方案1】:

    这样不会报错。

    #! /bin/bash
    
    searchstring=$1
    
    find . \( -name '*.c' -o -name '*.h' \) -exec grep -n "$searchstring" {} + \ 
            | sed -e "s/^\(\..*\.c\):\([0-9]*\):[ \t]*\(.*\)$/\1 :: \2\n\3\n/" \
            | sed -e "s/^\(\..*\.h\):\([0-9]*\):[ \t]*\(.*\)$/\1 :: \2\n\3\n/" \
            | sed ''/"$searchstring"/s//`printf "\033[31m""$searchstring""\033[0m"`/'' \
            | less -R
    

    但是,这并不意味着它有效。如果没有一些示例输入和所需的输出,就不可能为您提供进一步的帮助。例如第三个sed 对我来说似乎是错误的。

    【讨论】:

    • 感谢您的帮助!示例输入类似于./code_search.sh isValid,示例输出类似于/users/user/code/codefile1.c :: 15 boolean isValid, activatesCheck; /users/user/code/codefile1.c :: 321 if(!isValid) {,但运行时仍然出现错误;显然 find 有问题:find: paths must precede expression Usage: find [-H] [-L] [-P] [path...] [expression]
    【解决方案2】:

    这是因为,在最后一个 sed 命令中,字符

    sed ''/<SEARCH_STRING>/s//`printf "\033[31m<SEARCH_STRING>\033[0m"`/'' 
    

    应该改为

    sed '/<SEARCH_STRING>/s//'`printf "\033[31m<SEARCH_STRING>\033[0m"`'/' 
    

    另外,在出现错误之后,find 版本可能不支持命令末尾的 + 查看man find,在这种情况下 + 功能可以通过 xargs 完成(但如果文件名可以包含空格,这可能会失败)

    find . \( ... \) | xargs grep -n '<SEARCH_STRING>'
    

    【讨论】:

    • 感谢您的帮助!我已经尝试更改您的建议(组合和单独),但我仍然无法让脚本正常工作。每当我更改某些内容时,我仍然会收到错误消息;显然 find 有问题:find: paths must precede expression Usage: find [-H] [-L] [-P] [path...] [expression]
    猜你喜欢
    • 2012-12-02
    • 2016-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多