我有一个 shell 脚本,它将是其他脚本导入的标头
其主要目的是禁止使用“*”和“?”作为参数。
我已经尝试过了:
1) 通过 ~/.bash_history 访问脚本调用,因为 ~/.bash_history 会在用户会话结束时更新。我使用以下参数修改了 ~/.bashrc:shopt -s histappend、PROMPT_COMMAND="history -a;$PROMPT_COMMAND",还尝试了 PROMPT_COMMAND="history -a; history -c; history -r; $PROMPT_COMMAND"。
当我设置此设置时,系统开始在内存中更新 ~/.bash_history 文件。因此,理论上,我将能够获取用户使用的最后一个命令(应该是脚本调用)并在其上搜索“*”。但您可能知道,shell 脚本必须在其第一行中指定 shell 解释器,如:/bin/bash,因此,每次调用脚本时它都会创建一个新的 shell 会话,并且这个新会话无法访问上一个会话的命令历史记录:例如:
~>cat hist.sh
#!/bin/bash
var=$(tail -n 1 /home/$USER/.bash_history) # get the last command
echo $var
~>./hist.sh
cat hist.sh # that's the output, it shoud be ./hist.sh
我认为 ~/.bash_history 文件是在命令执行完成时写入的,这就是为什么 ./hist.sh 不存在的原因,但这只是我的猜测。
2) 我也尝试使用历史记录和 fc -l -n -0 命令(目前在 AIX 环境中有效),但在 Linux 中遇到了同样的问题。
3)我最后一次尝试的是以下脚本:
#!/bin/bash
for i in $@
do
if echo $i | grep '*' &> /dev/null
then echo "Invalid parameter *" && exit
else echo "Sucessful"
fi
done
当我使用 ./script.sh 文件*(““ + 单词或”“+ 单词),但是当我单独使用“*”(./script.sh *)时则不然,因为 shell 在 if 语句之前将 * 扩展为当前目录的所有文件。
我已经考虑过限制脚本的参数数量,但由于它将成为许多其他脚本有用的标题,所以每次调用的参数数量肯定是未知的。
有人能帮忙解决这个问题吗?我将不胜感激!