折叠:运行带参数的脚本时列数无效

问题描述

运行带有包含命令替换的参数的脚本时出现奇怪的行为。我想了解为什么会发生这种行为。脚本是:

#!/bin/bash

# MAIL=$1
# USER=$2
PASSWORD=$(cat /dev/urandom | tr -dc 'a-zA-Z0-9' | fold -w ${1:-20} | head -n 1);
echo "$PASSWORD"

然后我运行:./test.sh mail user,出现错误fold: invalid number of columns: ‘mail’ 并且不会生成密码。

如果我不传递参数或不生成密码,它就可以正常工作。

更新(为了理解行为)

我想我已经知道发生了什么: 当运行带有两个参数的脚本时,$1 and $2 具有传递的值。例子: ./test.sh arg1 arg2$1 -> arg1$2 -> arg2

在脚本中使用管道时,仍会传递原始参数,因此如果您有两个参数作为输入,您会将管道输出插入到第三个位置 $3

  • $1 -> arg1
  • $2 -> arg2
  • $3 -> piped output 所以一个可行的解决方案是:
PASSWORD=$(cat /dev/urandom | tr -dc 'a-zA-Z0-9' | fold -w ${3:-20} | head -n 1);

但是如果您改变输入参数,它将不起作用。因此,最好的解决方案是@KamilCuk 建议的:

PASSWORD=$(< /dev/urandom tr -dc 'a-zA-Z0-9' | fold -w 20 | head -n 1);

解决方法

如果您不想将第一个脚本参数传递给 fold,则不要在其中使用 $1

PASSWORD=$(< /dev/urandom tr -dc 'a-zA-Z0-9' | fold -w 20 | head -n 1);
#                                                      ^^ - pass the number,not $1
echo "$PASSWORD"