如何获取用户调用 shell 脚本时使用的所有参数?或者禁止使用 * 作为有效参数?

如何获取用户调用 shell 脚本时使用的所有参数?或者禁止使用 * 作为有效参数?

我有一个 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 语句之前将 * 扩展为当前目录的所有文件。

我已经考虑过限制脚本的参数数量,但由于它将成为许多其他脚本有用的标题,所以每次调用的参数数量肯定是未知的。

有人能帮忙解决这个问题吗?我将不胜感激!

相关内容