【问题标题】:How to split up function from arguments in bash?如何将函数与bash中的参数分开?
【发布时间】:2018-11-08 21:39:09
【问题描述】:

我正在编写一个名为 safeDel.sh 的 bash 脚本,其基本功能包括:

  • 文件 [file1, file2, file3...]
  • -l
  • -t
  • -d
  • -m
  • -k
  • -r 参数

对于单字母参数,我使用的是内置函数 getops,它可以正常工作。我现在遇到的问题是“文件”参数。 'file' 参数应该采用要移动到如下目录的文件列表:

$ ./safeDel.sh file file1.txt file2.txt file3.txt

以下是我的程序开始的sn-p:

#! /bin/bash

files=("$@")
arg="$1"
echo "arguments: $arg $files" 

echo 语句显示如下:

$ arguments : file file

如何将文件参数与必须移动到目录的文件分开?

【问题讨论】:

  • Shellcheck 发现代码 sn -p 的问题之一(数组变量使用不正确)。
  • 使用数组,echo "$files" 就像echo "${files[0]}"

标签: bash command-line-arguments


【解决方案1】:

假设 getopts 处理的选项已从命令行参数列表中移出,并且已进行检查以确保至少保留两个参数,则此代码应该执行所需的操作:

arg=$1
files=( "${@:2}" )

echo "arguments: $arg ${files[*]}"

files=( "${@:2}" ) 将第一个之后的所有命令行参数放入名为files 的数组中。请参阅Handling positional parameters [Bash Hackers Wiki] 了解更多信息。

${files[*]} 扩展为echo 参数内的files 数组中的文件列表。要安全地扩展 files 中的列表以进行循环,或传递给命令,请使用 "${files[@]}"。见Arrays [Bash Hackers Wiki]

【讨论】:

  • 或者,arg=$1; shift; files=("$@")
【解决方案2】:

这是满足您需求的一种方式:

#!/bin/bash

declare -a files="$@"
for fileToManage in ${files}; do
  echo "Managing ... $fileToManage"
done

但它只有在你的文件名中没有空格的情况下才有效,在这种情况下你需要做一些额外的工作。

如果您需要进一步的帮助,请告诉我。

【讨论】:

  • 圆括号你想要安全地循环files中的文件或将它们作为参数传递给其他命令所必需的。请参阅Why does my shell script choke on whitespace or other special characters?,尤其是“如何处理文件名列表?” (优秀)已接受答案中的部分。
  • Shellcheck 识别代码中"$@" 的不当使用。
  • pound-bang 和解释器之间没有space
  • 请注意,当files 命名一个数组时,${files} 等价于${files[0]},这可能不是我们想要的。使用"${files[@]}" 来合理地迭代数组的元素。 declare -a files="$@" 表示法将"$@" 中的所有参数映射为一个参数。你真的需要declare -a files=("$@") 来获取数组中的多个元素。请参阅 declarearrays 上的 Bash 手册 - 并进行实验。
猜你喜欢
  • 1970-01-01
  • 2011-10-06
  • 2019-06-16
  • 1970-01-01
  • 1970-01-01
  • 2013-05-03
  • 1970-01-01
  • 2011-03-16
  • 2011-11-18
相关资源
最近更新 更多