Bash 使用getopts grep文件并将其导出到文件:为什么会提到另一个参数?

Bash 使用getopts grep文件并将其导出到文件:为什么会提到另一个参数?,bash,unix,getopts,Bash,Unix,Getopts,我使用getopts获取MAC地址,并通过日志文件grep该MAC地址。看起来是这样的: #!/bin/bash while getopts ":m:hx:" opt; do case $opt in m) cat /var/log/vmlog/Verimatrix.log | grep $OPTARG | grep VCAS080455 cat /var/log/vmlog/Verimatrix.log | grep $OPTARG | grep

我使用getopts获取MAC地址,并通过日志文件grep该MAC地址。看起来是这样的:

#!/bin/bash

while getopts ":m:hx:" opt; do
  case $opt in
    m)
        cat /var/log/vmlog/Verimatrix.log | grep $OPTARG | grep VCAS080455
        cat /var/log/vmlog/Verimatrix.log | grep $OPTARG | grep VCAS080285
        cat /var/log/vmlog/Verimatrix.log | grep $OPTARG | grep VCAS080290
      ;;
    h)
        echo "./search_mac.sh -m <mac address> will filter the logs by mac address"
        echo "./search_mac.sh -h will print this message"
      ;;
    \?)
      echo "Invalid option: -$OPTARG" >&2
      ;;
  esac
done
我现在不明白如何从-x得到参数,使之成为我的案例的m)部分

一点帮助就好了


谢谢

我认为最好的方法是将选项参数的值保存在shell变量中,然后在最后运行命令:

#!/bin/bash

m_arg=
x_arg=

while getopts ":m:hx:" opt; do
  case $opt in
    m) m_arg="$OPTARG" ;;
    x) x_arg="$OPTARG" ;;
    h)
        echo "./search_mac.sh -m <mac address> will filter the logs by mac address"
        echo "./search_mac.sh -h will print this message"
        exit 0
      ;;
    \?)
      echo "Invalid option: -$OPTARG" >&2
      exit 1
      ;;
  esac
done

if [[ "$x_arg" ]] ; then
    exec > "$x_arg"          # redirect STDOUT to argument of -x
fi

< /var/log/vmlog/Verimatrix.log grep -- "$m_arg" | grep VCAS080455
< /var/log/vmlog/Verimatrix.log grep -- "$m_arg" | grep VCAS080285
< /var/log/vmlog/Verimatrix.log grep -- "$m_arg" | grep VCAS080290
#/bin/bash
m_arg=
x_arg=
而getopts:m:hx:opt;做
案例$opt-in
m) m_arg=“$OPTARG”;;
x) x_arg=“$OPTARG”;;
h)
echo.“/search_mac.sh-m将按mac地址过滤日志”
echo.“/search_mac.sh-h将打印此消息”
出口0
;;
\?)
echo“无效选项:-$OPTARG”>&2
出口1
;;
以撒
完成
如果[“$x_arg”];然后
exec>“$x_arg”#将标准输出重定向到-x的参数
fi

也就是说。这个选项对我来说似乎没有什么用处,因为
-x/home/nico/extract.txt
的含义与
/home/nico/extract.txt
的含义相同。我遗漏了什么吗?

我认为最好的方法是将选项参数的值保存在shell变量中,然后在最后运行命令:

#!/bin/bash

m_arg=
x_arg=

while getopts ":m:hx:" opt; do
  case $opt in
    m) m_arg="$OPTARG" ;;
    x) x_arg="$OPTARG" ;;
    h)
        echo "./search_mac.sh -m <mac address> will filter the logs by mac address"
        echo "./search_mac.sh -h will print this message"
        exit 0
      ;;
    \?)
      echo "Invalid option: -$OPTARG" >&2
      exit 1
      ;;
  esac
done

if [[ "$x_arg" ]] ; then
    exec > "$x_arg"          # redirect STDOUT to argument of -x
fi

< /var/log/vmlog/Verimatrix.log grep -- "$m_arg" | grep VCAS080455
< /var/log/vmlog/Verimatrix.log grep -- "$m_arg" | grep VCAS080285
< /var/log/vmlog/Verimatrix.log grep -- "$m_arg" | grep VCAS080290
#/bin/bash
m_arg=
x_arg=
而getopts:m:hx:opt;做
案例$opt-in
m) m_arg=“$OPTARG”;;
x) x_arg=“$OPTARG”;;
h)
echo.“/search_mac.sh-m将按mac地址过滤日志”
echo.“/search_mac.sh-h将打印此消息”
出口0
;;
\?)
echo“无效选项:-$OPTARG”>&2
出口1
;;
以撒
完成
如果[“$x_arg”];然后
exec>“$x_arg”#将标准输出重定向到-x的参数
fi

也就是说。这个选项对我来说似乎没有什么用处,因为
-x/home/nico/extract.txt
的含义与
/home/nico/extract.txt
的含义相同。我遗漏了什么吗?

嗨,谢谢你的快速回答。我在聚会上还是个笨蛋。我不太清楚重定向在您的示例中是如何工作的。是打字错误还是重定向前应该有$x_arg,比如:$x_argexec符号意味着从脚本中的该点开始,I/O重定向将发生更改。在这种情况下,写入标准输出的任何内容现在都会将其输出转到
$x_arg
/home/nico/extract.txt
)中的任何内容。再次感谢:)您最终是正确的,我想要的只是>,但该文件是可变的,这就是为什么它是一个参数。我只是不知道有什么更好的方法。。。注意,您可以这样做:
file=/home/nico/extract.txt/search_mac.sh-m 00067B6D87F0>$file
。也就是说,重定向中的文件名可以由变量指定。您好,谢谢您的快速回答。我在聚会上还是个笨蛋。我不太清楚重定向在您的示例中是如何工作的。是打字错误还是重定向前应该有$x_arg,比如:$x_argexec符号意味着从脚本中的该点开始,I/O重定向将发生更改。在这种情况下,写入标准输出的任何内容现在都会将其输出转到
$x_arg
/home/nico/extract.txt
)中的任何内容。再次感谢:)您最终是正确的,我想要的只是>,但该文件是可变的,这就是为什么它是一个参数。我只是不知道有什么更好的方法。。。注意,您可以这样做:
file=/home/nico/extract.txt/search_mac.sh-m 00067B6D87F0>$file
。也就是说,重定向中的文件名可以由变量指定。您将获得UUOC(无用使用Cat)奖。三次!为什么不:
grep“$OPTARG”/var/log/vmlog/Verimatrix.log | grep-E'VCAS080455 | vcas08085 | VCAS080285 | VCAS080290'
因此只需扫描日志文件一次。你可以将第二个grep减少到
grep-E'VCAS080(455 | 285 | 290)
,而不会使脑细胞过度紧张。你将获得UUOC(无用使用Cat)奖。三次!为什么不:
grep“$OPTARG”/var/log/vmlog/Verimatrix.log | grep-E'VCAS080455 | vcas08085 | VCAS080285 | VCAS080290'
因此只需扫描日志文件一次。您可以将第二个grep减少到
grep-E'VCAS080(455 | 285 | 290)
,而不必过度拉紧脑细胞。