我想测试是否将扩充(例如-h)传递到我的bash脚本中。
在Ruby脚本中:
#!/usr/bin/env ruby
puts "Has -h" if ARGV.include? "-h"
如何在Bash中做到最好?
答案 0 :(得分:3)
这是非常复杂的。最快捷的方式也是不可靠的:
case "$*" in
(*-h*) echo "Has -h";;
esac
不幸的是,这也会将“command this-here
”视为“-h
”。
通常你会使用getopts
来解析你期望的参数:
while getopts habcf: opt
do
case "$opt" in
(h) echo "Has -h";;
([abc])
echo "Got -$opt";;
(f) echo "File: $OPTARG";;
esac
done
shift (($OPTIND - 1))
# General (non-option) arguments are now in "$@"
等
答案 1 :(得分:1)
#!/bin/bash
while getopts h x; do
echo "has -h";
done; OPTIND=0
正如Jonathan Leffler所指出的那样 OPTIND = 0将重置getopts列表。如果测试需要不止一次进行,那就是这样。
答案 2 :(得分:1)
我在这里的问题中找到了答案:https://serverfault.com/questions/7503/how-to-determine-if-a-bash-variable-is-empty
请参阅下面的函数mt()以获取示例用法:
# mkdir -p path to touch file
mt() {
if [[ -z $1 ]]; then
echo "usage: mt filepath"
else
mkdir -p `dirname $1`
touch $1
fi
}
答案 3 :(得分:0)
最简单的解决方案是:
if [[ " $@ " =~ " -h " ]]; then
echo "Has -h"
fi
答案 4 :(得分:0)
我正在尝试以一种简单而正确的方式解决这个问题,并且只是分享对我有用的方法。
下面的专用函数解决了它,你可以像这样使用:
if [ "$(has_arg "-h" "$@")" = true ]; then
# TODO: code if "-h" in arguments
else
# TODO: code if "-h" not in arguments
fi
此函数检查第一个参数是否在所有其他参数中:
function has_arg() {
ARG="$1"
shift
while [[ "$#" -gt 0 ]]; do
if [ "$ARG" = "$1" ]; then
echo true
return
else
shift
fi
done
echo false
}