问题描述
运行带有包含命令替换的参数的脚本时出现奇怪的行为。我想了解为什么会发生这种行为。脚本是:
#!/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
。
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"