相关疑难解决方法(0)

为什么我的 shell 脚本会因空格或其他特殊字符而阻塞?

或者,有关强大的文件名处理和在 shell 脚本中传递的其他字符串的介绍性指南。

我写了一个 shell 脚本,它在大多数情况下运行良好。但它在某些输入(例如某些文件名)上窒息。

我遇到了如下问题:

  • 我有一个包含空格的文件名hello world,它被视为两个单独的文件helloworld.
  • 我有一个带有两个连续空格的输入行,它们在输入中缩小为一个。
  • 前导和尾随空格从输入行中消失。
  • 有时,当输入包含其中一个字符时\[*?,它们会被一些文本替换,这实际上是文件的名称。
  • 输入中有一个撇号'(或双引号"),在那之后事情变得很奇怪。
  • 输入中有一个反斜杠(或者:我使用的是 Cygwin 并且我的一些文件名具有 Windows 样式的\分隔符)。

这是怎么回事,我该如何解决?

shell bash shell-script quoting whitespace

341
推荐指数
3
解决办法
32万
查看次数

将 $@ 分配给 shell 函数中的另一个变量

我正在制作一个gc可以区分 git commit/checkout的智能别名。

如果gc在不带任何参数或带有-a,-m参数的情况下调用,则运行 git commit。否则,运行 git checkout(如果有一个b带有附加参数的标志)。如果调用 gc 的任何其他变体,我宁愿它抛出错误而不是做一些意想不到的事情。

到目前为止,这是我的 shell 函数。

gc() {
    args=$@
    commit=false
    checkout=false

    # Check flags
    while getopts ":am:b" opt; do
        case $opt in
            a|m)
                commit=true
                ;;
            b)
                checkout=true
                ;;
            \?)
                echo "Unknown flags passed."
                return 1
                ;;
        esac
    done

    shift "$((OPTIND-1))"

    # Check number of arguments
    if [[ "$#" == 0 ]]; then
        commit=true
    elif [[ "$#" == 1 ]]; then
        checkout=true
    else
        echo …
Run Code Online (Sandbox Code Playgroud)

bash zsh array shell-script

3
推荐指数
1
解决办法
351
查看次数

标签 统计

bash ×2

shell-script ×2

array ×1

quoting ×1

shell ×1

whitespace ×1

zsh ×1