在 bash shell 脚本中,$2 可以等于命令行上的多个参数吗?还是需要 $3、$4 等等?

在 bash shell 脚本中,$2 可以等于命令行上的多个参数吗?还是需要 $3、$4 等等?

在下面的示例脚本中,它用于发送到一个或两个电子邮件地址,具体取决于使用该脚本的进程。我是否需要添加 3 美元来购买额外的电子邮件地址,还是 2 美元就足够了?

(
for file in /usr/app/tst/$1/MS_CASE_ST*.csv;
do
   uuencode ${file} $(basename ${file})
done
) | mailx -s "MS_CASE_ST*.csv file contains data. Please Research" $2 

脚本 example.sh 的执行方式示例:

$ ./example.sh output [email protected] [email protected]

答案1

$2永远只是第二个参数。 $@是所有参数的数组,所以如果你想要第二个直到最后,你可以这样做:

... | mailx -s "MS_CASE_ST*.csv file contains data.  Please research" "${@:2}"

the:2指定了一个偏移量参数扩展当扩展$@数组时

答案2

要使用此特定脚本支持多个收件人,请用作$1路径元素,然后将其从位置参数列表中移出。现在列表$@,仅包含收件人。

#!/bin/bash

dir=$1
shift

shopt -s nullglob

for file in "/usr/app/tst/$dir/MS_CASE_ST"*.csv; do
    uuencode "$file" "$( basename "$file" )"  # or uuencode "$file" "${file##*/}"
done | mailx -s 'MS_CASE_ST*.csv file(s) contains data. Please Research' "$@"

一些注意事项:

  • 请小心并用双引号引起来任何变量扩展,否则当路径名包含空格或文件名通配字符等(以及单引号静态字符串)时,您将会遇到问题。

  • 引用$@as"$@"确保它扩展到单独引用的元素。

  • 通过nullglob在 中设置 shell 选项bash,我们确保循环使用的通配模式扩展到没有什么如果它与任何现有路径名不匹配。

答案3

这个问题似乎很混乱命令的参数read。它们是不同的:

  1. 贝壳:

    set -- foo bar baz buzz zap bang ; echo $2
    

    输出只有第二个词:

    bar
    
  2. read具有两个变量名的命令:

    echo foo bar baz buzz zap bang | (read x y ; echo $y )
    

    输出包括第二个单词在内的所有内容:

    bar baz buzz zap bang
    

相关内容