查找特定参数并将其传递给命令

查找特定参数并将其传递给命令

我有一个名为测试脚本需要运行一个名为运行命令如下:

./run_command <input path>

如果我为脚本提供以下参数:

./test_script argument1=sometext argument2=othertext inputpath=/folder1/folder2/file.txt argument4=moretext

如何让脚本找到参数输入路径=/folder1/folder2/file.txt并通过/文件夹1/文件夹2/文件.txt运行命令?请记住,inputpath=/folder1/folder2/file.txt 不一定总是位于第三位,并且提供的参数数量可能会有所不同。

答案1

zsh

#! /bin/zsh -
inputpath=(${${(M)argv:#inputpath=*}#*=})
(($#inputpath > 0)) && ./run-command $inputpath

会提取所有小路sinputpath=path作为脚本的参数,并将非空参数存储在$inputpath数组中。然后./run-command,如果找到的话,我们将这些输入路径作为参数运行。

POSIXly,你可以这样做:

#! /bin/sh -
run_with_extracted_keyword() (
  cmd="${1?}" keyword="${2?}"
  shift 2
  for arg do
    case $arg in
      ("$keyword="*) set -- "$@" "${arg#*=}"
    esac
    shift
  done
  [ "$#" -gt 0 ] && exec "$cmd" "$@"
)

run_with_extracted_keyword ./run-command inputpath "$@"

GNUly,你可以这样做:

#! /bin/bash -
set -o pipefail
printf '%s\0' "$@" |
  LC_ALL=C grep -zPo '^inputpath=\K(?s:.*)' |
  xargs -r0 ./run-command

答案2

如果您控制输入,并且可以限制脚本访问以防止 shell 注入,我会做什么,如 Stéphane 在评论中所述:

#!/bin/bash
  
for arg; do
    declare "$arg"
done

echo "$argument1"

sometext

通常,要访问位置参数,您可以执行echo $1, $2, $3...

但如果你使用这种var=value形式,这段代码会更适合

相关内容