条件语句在 中不起作用。 ./脚本

条件语句在 中不起作用。 ./脚本

我正在尝试制作历史文件操作脚本。

例如,当我尝试通过运行来实现隐身模式时

unset HISTFILE

由于命令在新 shell 中运行,因此它不起作用。当我尝试时

. ./script

该命令有效,但我用来处理传递给脚本的参数的条件会导致语法错误。

有什么解决方法吗? 已解决:问题是错误的条件使用和 zsh 脚本的不适应。

case $1 in
    (set)
        HISTFILE=$2
        HISTFILESIZE=$3
        ;;
    (incognito)
        unset HISTFILE
        ;;
    (removesizelimit)
        HISTSIZE=-1
        HISTFILESIZE=-1
        ;;
    (clear)
        rm -f $HISTFILE
        unset HISTFILE && exit
        ;;
    (backup)
        tar -cf HISTFILE.tar $HISTFILE
        ;;
    ("")
        echo "Usage:"
        echo " . ./history <option>"
        echo " . ./history set <HISTSIZE> <HISTFILESIZE>"
        echo
        echo "Manipulate history file"
        echo
        echo "Options:"
        echo -e " incognito\t\t\tdo not record history of commands in this session"
        echo -e " removesizelimit\t\tremove limitation of size of history file"
        echo -e " clear\t\t\t\tclear history of run commands"
        echo -e " backup\t\t\t\tclear create a backup of history file in archive"
        ;;
    (*)
        echo "ERROR: Option unrecognized"
        echo
        echo "run . ./history for help"
esac

答案1

注意,在问题编辑之前,这个答案的大部分内容都更有意义:)

这个错误很简单:

if [ "$1" == "proto" ]; then
    TESTVAR=
if [ "$1" == "set" ]; then
    HISTFILE=$2
    HISTFILESIZE=$3
elif [ "$1" == "incognito" ]; then
# ....

这里的第二个if应该是elifbash正在抱怨,因为找不到匹配的fi.

关于该脚本,我还想提及两件事:

  1. 这将在子 shell 中运行并执行命令的输出unset,这不是您想要的:

    $(unset HISTFILE)
    

    您应该$(...)从中删除操作员。

  2. #!/bin/bash意味着该脚本可以作为二进制文件的参数独立执行/bin/bash。这对于这样的脚本没有意义,所以我建议不要这样做(并且我建议不要对其设置可执行权限)。


最后一件事。通过嵌套 if/else 进行参数解析有点笨拙。您可以使用一个case语句:

case $1 in
    (proto) TESTVAR= ;;
    (set)
        HISTFILE=$2
        HISTFILESIZE=$3
        ;;
    #...etc...
    ("")
        # ... put your usage here...
        ;;
    (*)
        echo >&2 "ERROR: Option unrecognized"
        echo >&2
        echo >&2 "run . ./history.bash for help"
        ;;
esac

使脚本在 zsh 下工作:

  1. 将的用法替换===.该==运算符是该运算符的非标准别名=,这是它中断的情况之一。
  2. 重命名HISTFILESIZESAVEHIST

相关内容