gpt4 book ai didi

bash - 如何处理 shell 脚本参数中的 "--"?

转载 作者:行者123 更新时间:2023-11-29 09:03:27 25 4
gpt4 key购买 nike

这个问题有 3 个部分,每个部分都很简单,但组合在一起并不简单(至少对我而言):)

需要写一个脚本,应该把什么作为它的参数:

  1. 另一个命令的名字
  2. 命令的几个参数
  3. 文件列表

例子:

./my_script head -100 a.txt b.txt ./xxx/*.txt
./my_script sed -n 's/xxx/aaa/' *.txt

等等。

在我的脚本中出于某种原因我需要区分

  • 命令是什么
  • 命令的参数是什么
  • 文件是什么

所以写上面例子的最标准的方法可能是:

./my_script head -100 -- a.txt b.txt ./xxx/*.txt
./my_script sed -n 's/xxx/aaa/' -- *.txt

问题1:有没有更好的解决方案?

在 ./my_script 中处理(第一次尝试):

command="$1";shift
args=`echo $* | sed 's/--.*//'`
filenames=`echo $* | sed 's/.*--//'`

#... some additional processing ...

"$command" "$args" $filenames #execute the command with args and files

filenames 包含 spaces 和/或 '--' 时,此解决方案将失败,例如
/some--path/to/more/白痴文件名.txt

问题 2:如何正确获取 $command$args$filenames 以便稍后执行?

问题 3: - 如何实现以下执行风格?

echo $filenames | $command $args #but want one filename = one line (like ls -1)

这里是好的 shell 解决方案,还是需要使用例如 perl?

最佳答案

首先,听起来您正在尝试编写一个脚本,该脚本接受一个命令和一个文件名列表,然后依次对每个文件名运行该命令。这可以在 bash 中一行完成:

$ for file in a.txt b.txt ./xxx/*.txt;do head -100 "$file";done$ for file in *.txt; do sed -n 's/xxx/aaa/' "$file";done

However, maybe I've misinterpreted your intent so let me answer your questions individually.

Instead of using "--" (which already has a different meaning), the following syntax feels more natural to me:

./my_script -c "head -100" a.txt b.txt ./xxx/*.txt./my_script -c "sed -n 's/xxx/aaa/'" *.txt

To extract the arguments in bash, use getopts:

SCRIPT=$0

while getopts "c:" opt; do
case $opt in
c)
command=$OPTARG
;;
esac
done

shift $((OPTIND-1))

if [ -z "$command" ] || [ -z "$*" ]; then
echo "Usage: $SCRIPT -c <command> file [file..]"
exit
fi

如果你想为每个剩余的参数运行一个命令,它看起来像这样:

for target in "$@";do
eval $command \"$target\"
done

如果你想从 STDIN 读取文件名,它看起来更像这样:

while read target; do
eval $command \"$target\"
done

关于bash - 如何处理 shell 脚本参数中的 "--"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6123392/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com