我正在尝试制作历史文件操作脚本。
例如,当我尝试通过运行来实现隐身模式时
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
应该是elif
。bash
正在抱怨,因为找不到匹配的fi
.
关于该脚本,我还想提及两件事:
这将在子 shell 中运行并执行命令的输出
unset
,这不是您想要的:$(unset HISTFILE)
您应该
$(...)
从中删除操作员。这
#!/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 下工作:
- 将的用法替换
==
为=
.该==
运算符是该运算符的非标准别名=
,这是它中断的情况之一。 - 重命名
HISTFILESIZE
为SAVEHIST