我有一个名为测试脚本需要运行一个名为运行命令如下:
./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
形式,这段代码会更适合