说,我有一个用这行调用的脚本:
./myscript -vfd ./foo/bar/someFile -o /fizz/someOtherFile
Run Code Online (Sandbox Code Playgroud)
或者这个:
./myscript -v -f -d -o /fizz/someOtherFile ./foo/bar/someFile
Run Code Online (Sandbox Code Playgroud)
什么是分析这使得在每一种情况下(或两者的组合)的接受的方式$v,$f以及 $d将全部设置为true和$outFile将等于/fizz/someOtherFile?
假设我已经定义了一个function abc()将处理与分析传递给我的脚本的参数相关的逻辑.
如何将我的bash脚本收到的所有参数传递给它?params的数量是可变的,所以我不能像这样硬编码传递的参数:
abc $1 $2 $3 $4
Run Code Online (Sandbox Code Playgroud)
编辑.更好的是,我的函数有没有办法访问脚本参数的变量?
我有一个bash文件,我传递的参数就像
bash foo.sh update -f /var/ -v true
Run Code Online (Sandbox Code Playgroud)
所以根据这个答案我的脚本应该是这样的
if [[ "$1" == "update" ]]; then
updater
fi
function updater(){
verbose='false'
fflag=''
error=''
while getopts 'f:v' flag; do
case "${flag}" in
f) fflag="${OPTARG}";;
v) verbose='false';;
*) error="bflag";;
esac
done
echo $fflag
}
Run Code Online (Sandbox Code Playgroud)
我使用第一个脚本作为入口点,因为我有其他功能做其他事情,但由于某种原因,上面的脚本甚至没有显示$fflag我尝试从函数中移出getopts循环的值无济于事
我有一个 case 语句,它是我命令的一部分,我希望它遍历所有 args,直到它们都被消耗掉。
while [ ! -z ${@:2} ] ; do
case "${@:2}" in
-d|--delete*)
YES_DELETE=1
shift
;;
-nd|--nodelete*)
NO_DELETE=1
shift
;;
-y|--yes*)
SKIP_PROMPT=1
shift
;;
-*|*)
echo "Bad command, try again."
;;
esac
done
Run Code Online (Sandbox Code Playgroud)
我的命令$@是$ mpip stt=12 -nd -y使${@:2}="-nd -y". 如果它也像我想要的那样工作,它会在迭代两次后退出 while 循环并且NO_DELETE=1 SKIP_PROMPT=1为真。当我运行它时,一切都还没有初始化,它变成了一个无限循环,我不知道我做错了什么。